简介

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自行下载地址

  • 导入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;
}

第六章(-)

  • -


文档

待写