- 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;
}
第六章(-)
- 
-
文档
待写
 
      