CDE教程

· · 休闲·娱乐

前往主页

教程

==前言==

注意: 本教程基于CDE6编写,CDE7及以后版本部分有所不同

注意: 本教程仅讲述基础常用的内容,其他用法请参考文档

注意: 本教程内容讲的不全,以及不同版本的差别,具体需要参考代码

注意: "&"是必学内容,"~"是了解内容

一些表述: <类型>标识符 ,用于讲述一个变量,参数,函数

一些表述: "CDEx"为CDE的第x版本,比如"CDE6",由开发者决定使用第几个版本,勿填写"CDEx",注意在CDE6之前的版本写的是"CharDx"

& ==第一章(了解整体架构)==

xy用于存储坐标

xy拥有两个变量, <int>x <int>y

xy拥有三个运算符, == + -

picture用于存储图片(并非Item)

picture拥有三个变量, <int>l <int>h <vector<string>>g

Item为一个角色的类

Main为窗口运行框架类

~ ==第二章(了解Item类)==

基础组:

1.初始化组 - 第一代加入

2.获取组(get) - 第一代加入

3.导入组 - 第一代加入

4.绘制组 - 第一代加入

5.动作组 - 第一代加入

高级组:

1.本体变量组(T) - 第六代加入

2.克隆组(clone) - 第三代加入

3.图片组(group) - 第四代加入

4.动画组(frame) - 第五代加入

5.碰撞组(crash) - 第二代加入

6.工具组 - 第一代加入,注意不是"Tool::"

& ==第三章(Hello world!)==

需要C++11版本

-std=c++11

复制CDEx代码,保存文件名为"CDEx.h",记得编译

CDEx.h复制代码地址

新建cpp代码

#include "CDEx.h"
Item a({0,0});

注意:{0,0}是<xy>类型的,代表Item的初始位置

a.code_load(1,"Hello world!");

注意:1是<int>类型的,代表图片的行数(len),"Hello world!"是<string>类型的,代表图片

注意:图片是矩形的图片,在文件导入中,空格请用"`"代替,这点很重要

注意:图片的字符会根据传入的行数自动分割,无需添加"\n"等,例如

填写 (1,"[][][][]") 是 

[][][][]

填写 (2,"[][][][]") 是 

[][]
[][]

填写 (4,"[][][][]") 是 

[]
[]
[]
[]

注意 : CDE7及以上版本可以通过初始化代替"code_load"

Item temp({0,0},{"[][][][]"});
是

[][][][]

Item temp({0,0},{"[][]","[][]"});
是

[][]
[][]

Item temp({0,0},{"[]","[][][]"});
是

[]    <-这里被空格代替(程序会自动补全空格)
[][][]

Item temp({0,0},{"[]","[]","[]","[]"});
是

[]
[]
[]
[]
a.draw();
while(1)
{
    a.draw();
    a.sleep(20);//CDE7及以后版本使用"Tool::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);//CDE7及以后版本使用"Tool::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

在本章节需要学习的用法:

clone_this()

克隆一个一模一样的自己

继承除了clone组以外的其他变量

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格,如果碰到边界,就清除克隆体

move_key()

默认wasd移动,移动格数1格

goto_item(<Item>p,<xy>py={0,0})

<xy>py 是传送后的偏移量

其实相对移动还有个用法

在移动结束,会返回一个<bool>值,代表是否移动成功

如果碰到边界就会返回0

move_xy(<xy>p)
kill()

多用于清除克隆体

show()

参数中,检测填1,否则填0

注意 : CDE6及之前的鼠标检测(按下检测,位置检测)都是Item类的类函数,CDE7及以后是全局命名空间Tool的函数

本文以CDE6编写,如使用CDE7等高版本,请更改部分代码

CDE6及之前:
temp.mouse_down(<bool>left,<bool>mid,<bool>right)//注意:这里的temp是一个Item类

CDE7及之后:
Tool::mouse_down(<bool>left,<bool>mid,<bool>right)//注意:无需使用Item类

例如:

需要检测按下左键

CDE6及之前:
temp.mouse_down(1,0,0)

CDE7及之后:
Tool::mouse_down(1,0,0)

需要检测同时按下左键和右键

CDE6及之前:
temp.mouse_down(1,0,1)

CDE7及之后:
Tool::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;
}

==第六章(-)==