- C23panweiming's blog
CDE说明
- 2025-2-10 18:10:26 @
简介
CharDrawEngine,字符绘制工具,简称CDE
CDE是基于C++11开发的工具
CDE当前有7个版本,最新版本为CDE7
CDE底层是 以字符为像素的"图片"为一个Item
作用多为小游戏,小型软件的开发
CDE有基本的框架即可使用,方便开发
教程
前言
注意: 本教程仅讲述基础常用的内容,其他用法请参考最下方的"文档"
注意: 本教程有部分地方讲的不全,具体还是要参考头文件代码
注意: "&"是必学内容,"~"是了解内容
一些表述: <类型>标识符 ,用于讲述一个变量,参数,函数
一些表述: "CDEx"为CDE的第x版本,比如"CDE6",由开发者决定使用第几个版本,勿填写"CDEx",当然,在CDE6之前的版本写的是"CharDx"
& 第一章(了解整体架构)
-
CDE中有两种结构体(xy,picture)
xy用于存储坐标
xy拥有两个变量, <int>x <int>y
xy拥有三个运算符, == + -
picture用于存储图片(并非Item)
picture拥有三个变量, <int>l <int>h <vector<string>>g
-
CDE中有两种类(Item,Main)
Item为一个角色的类
Main为窗口运行框架类
-
CDE中有好几个全局函数
~ 第二章(了解Item类)
-
Item有多个组
基础组:
1.初始化组 - 第一代加入
2.获取组(get) - 第一代加入
3.导入组 - 第一代加入
4.绘制组 - 第一代加入
5.动作组 - 第一代加入
高级组:
1.本体变量组(T) - 第六代加入
2.克隆组(clone - 第三代加入
3.图片组(group) - 第四代加入
4.动画组(frame) - 第五代加入
5.碰撞组(crash) - 第二代加入
6.工具组 - 第一代加入
-
Item除了本体变量组的变量,其他变量都是private状态
& 第三章(Hello world!)
-
调整C++
需要C++11版本
-std=c++11
-
生成CDEx.h
复制CDEx代码,保存文件名为"CDEx.h",记得编译
-
导入CDE
新建cpp代码
#include "CDEx.h"
-
创建Item
Item a({0,0});
注意:{0,0}是<xy>
类型的,代表Item的初始位置
-
导入图片
a.code_load(1,"Hello world!");
注意:1是<int>
类型的,代表图片的行数(len),"Hello world!"是<string>
类型的,代表图片
注意:图片是矩形的图片,空格请用"`"代替,这点很重要
注意:图片的字符会根据传入的行数自动分割,无需添加"\n"等,例如
填写 (1,"[][][][]") 是
[][][][]
填写 (2,"[][][][]") 是
[][]
[][]
填写 (4,"[][][][]") 是
[]
[]
[]
[]
-
显示到窗口上
a.draw();
-
解决"请按任意键继续..."
while(1)
{
a.draw();
a.sleep(20);
}
-
总代码
#include "CDEx.h"
using namespace std;
int main()
{
Item a({0,0});//Item
a.code_load(1,"Hello world!");//导入字符图片
while(1)
{
a.draw();//绘制字符图片
a.sleep(20);
}
return 0;
}
& 第四章(控制小人,实现左右移动和跳跃)
-
前置
本体变量组就是每个Item拥有其他的自定义变量,由开发者编写
简单说,就是让某个Item有自己的变量,方便开发
在本章节需要学习的用法:
Tmap_int[<string>name]=<int>value
其实底层就是<map>
-
初始化
Item a({15,60});
a.code_load(3,"`O`\\|//`\\");
a.Tmap_int["t"]=1;
a.Tmap_int["flag"]=0;
-
左右移动
if(KEYDOWN('A'))
a.move_xy({0,-1});
if(KEYDOWN('D'))
a.move_xy({0,1});
move_xy(<xy>p)
移动Item相对格数(偏移数)
还有另一种写法 move_xy(<int>x,<int>y)
,都是一样的东西
-
跳跃
这里的跳跃并非简单的跳跃
而是帧跳,不会影响左右移动(就像Minecraft的一样)
代码复杂,请耐心解读
if(!a.Tmap_int["flag"] && KEYDOWN(' '))//判断是否跳跃
{
a.Tmap_int["t"]=1;
a.Tmap_int["flag"]=1;
}
if(a.Tmap_int["flag"] && a.Tmap_int["t"]<=5)//跳跃
a.move_xy({-1,0});
if(a.Tmap_int["flag"] && a.Tmap_int["t"]>=6)//落下
a.move_xy({1,0});
if(++a.Tmap_int["t"]>10)//结束动作
{
a.Tmap_int["flag"]=0;
a.Tmap_int["t"]=1;
}
-
总代码
#include "CDEx.h"
using namespace std;
int main()
{
Item a({15,60});//人物
a.code_load(3,"`O`\\|//`\\");
a.Tmap_int["t"]=1;
a.Tmap_int["flag"]=0;
while(1)
{
if(KEYDOWN('A'))//左移
a.move_xy({0,-1});
if(KEYDOWN('D'))//右移
a.move_xy({0,1});
if(!a.Tmap_int["flag"] && KEYDOWN(' '))//按下空格
{
a.Tmap_int["t"]=1;
a.Tmap_int["flag"]=1;
}
if(a.Tmap_int["flag"] && a.Tmap_int["t"]<=5)//跳
a.move_xy({-1,0});
if(a.Tmap_int["flag"] && a.Tmap_int["t"]>=6)//落
a.move_xy({1,0});
if(++a.Tmap_int["t"]>10)//结束动作
{
a.Tmap_int["flag"]=0;
a.Tmap_int["t"]=1;
}
a.draw();
a.sleep(20);
}
return 0;
}
& 第五章(发射子弹)
-
前置
克隆就是复制一个与本体一样的Item
在本章节需要学习的用法:
- 1.克隆本体
clone_this()
克隆一个一模一样的自己
继承除了clone组以外的其他变量
- 2.让所有克隆体执行某个函数
clone_run(<Item>(*fun)(Item))
这个函数传入的参数是自定义函数
返回值是Item,参数也是Item
目的是 让每个克隆体都执行这个函数
传入的参数就是 克隆体的Item
返回值就是 让克隆体重新赋值这个新的Item
例如:
Item fun(Item p)//p是旧的克隆体
{
p.show();
if(!p.move_xy({0,1}))//往右移动的同时碰到边界
p.kill();//清除
return p;//返回新的克隆体Item
}
这段代码就是让每个克隆体往右移动1格,如果碰到边界,就清除克隆体
- 3.通过键盘向四方移动
move_key()
默认wasd移动,移动格数1格
- 4.将某Item传送到另一个Item左上角
goto_item(<Item>p,<xy>py={0,0})
<xy>py
是传送后的偏移量
- 5.相对移动
其实相对移动还有个用法
在移动结束,会返回一个<bool>
值,代表是否移动成功
如果碰到边界就会返回0
move_xy(<xy>p)
- 6.清除Item
kill()
多用于清除克隆体
- 7.将隐藏的Item显示出来
show()
- 8.检测鼠标按下
参数中,检测填1,否则填0
mouse_down(<bool>left,<bool>mid,<bool>right)
例如:
需要按下左键
mouse_down(1,0,0)
需要同时按下左键和右键
mouse_down(1,0,1)
-
初始化
两种Item,分别是人物和子弹
子弹本体需要隐藏
Item a({15,60});
a.code_load(3,"`O`\\|//`\\");
Item b({15,60},1);//后面的1是隐藏Item
b.code_load(1,"^");
-
移动
a.move_key();
b.goto_item(a,{0,1});
-
子弹本体部分
if(b.mouse_down(1,0,0))
b.clone_this();
b.clone_run(fun_move);
-
子弹克隆体部分
Item fun_move(Item p)
{
if(!p.move_xy({-1,0}))
p.kill();
p.show();
return p;
}
-
总代码
#include "CDEx.h"
using namespace std;
Item fun_move(Item p)
{
p.show();
if(!p.move_xy({-1,0}))//向上移动同时检测是否碰到边界
p.kill();//清除克隆体
return p;
}
int main()
{
Item a({15,60});//人物
a.code_load(3,"`O`\\|//`\\");
Item b({15,60},1);//子弹
b.code_load(1,"^");
while(1)
{
a.move_key();//wasd移动
b.goto_item(a,{0,1});//移动到人物的正前方,注意要有偏移量,不然就会移动到左上角
if(b.mouse_down(1,0,0))//按下鼠标左键
b.clone_this();//克隆一个子弹
b.clone_run(fun_move);//对所有克隆体执行fun_move
a.draw();
a.sleep(20);
}
return 0;
}
第六章(-)
-
-
文档
待写