- ♂️iecne个人主页:点赞关注收藏评论支持哦~
- 每天关注iecne的作品,一起进步
- 本文收录专栏:【C++游戏引擎】
- 希望大家多多支持一起进步呀!
哈喽大家好,我是iecne,本期为大家带来的是CPP/C++【游戏引擎Easy2D】一篇打通引擎顶级类型,Listener。包教包会,快来看看吧!
引擎支持 Visual Studio 2013 及以上版本,如果你使用的是较低版本的 VS,那么你需要考虑一下更新你的编译器了
如何根据据【游戏引擎Easy2D】一文搞懂丨从各种角度详解分析监听器Listener + C++实现
本实践旨在通过多个代码的案列,让大家理解和掌握如何使用Easy2D引擎来将这四个基础类型详细的解释并且会运用
目录
【游戏引擎Easy2D】从各种角度详解分析监听器Listener + C++实现
往后看免费提供安装包
✨前言
任务描述
Easy2D导读
安装 Easy2D
零.Listener 监听器
一.鼠标按下监听例子
二.监听器的作用
三.监听器的启动和暂停
四.监听器的添加和移除
五.自定义事件
六.关于命名
总结
对于编程而言,初学者最需要的不是技能,而是成就感。
如果你喜欢用 C/C++ 编写自己的小游戏,那么 Easy2D 将是个不错的选择,它大大简化了游戏制作过程,可以帮助你快速开发 Windows 上的 2D 小游戏。
它的特点和它的名字一样,Everything is Easy!
使用简易安装器
运行里面的 install.bat 文件进行安装。
点击此链接进行下载(纯免费,给官方搞成了VIP)
下载点击这里,记得四连哦
安装程序会检测您已经安装的 Visual Studio
版本,并根据您的选择将对应库文件解压至 VS 库目录下。
Easy2D 不支持 VS2012 及以下的版本(包括 VC6.0),如果你使用的是低版本的 VS,那你需要尝试一下新版的 Visual Studio 了。
安装环境:
操作系统:Windows 7 及以上操作系统。
编译环境:Visual Studio 2013 (x86 & x64) 及以上版本。
Listener 监听器类用于监听某个事件的发生,并作出相应的处理。
例如,下面的代码创建了一个监听鼠标按下的事件:
// 监听器的回调函数
auto callback = [](Event* evt)
{
// 判断事件类型是否是鼠标按下
if (evt->type == Event::MouseDown)
{
// 鼠标按下事件发生了
// 作出相应处理
}
};
// 创建监听器
auto lis = gcnew Listener(callback);
// 让某个节点使用这个监听器
node->addListener(lis);
上面的代码也许晦涩难懂,简单来说,当一个事件发生时,事件会逐一发送给每一个节点(node),节点再将事件转发给监听器,监听器收到事件时会调用回调函数(callback)来处理这个事件。//官方语言
监听器可以监听到的事件有以下几种:
通过监听一下功能,做出判断
// 事件类型枚举
enum Type
{
MouseMove, // 鼠标移动
MouseDown, // 鼠标按下
MouseUp, // 鼠标抬起
MouseWheel, // 鼠标滚轮滑动
KeyDown, // 按键按下
KeyUp // 按键抬起
};
下面的回调函数示例给出了每种类型事件的处理方式:
这个说实话很难,实际用处不大,各位了解一下即可
// 监听器的回调函数
// 展示了所有事件的处理方式
auto callback = [](Event* evt)
{
if (evt->type == Event::MouseMove)
{
// 鼠标移动事件发生了
// 将事件类型转换为事件的实际类型
auto mouseEvt = (MouseMoveEvent*)evt;
mouseEvt->x; // 鼠标 x 坐标
mouseEvt->y; // 鼠标 y 坐标
}
else if (evt->type == Event::MouseDown)
{
// 鼠标按下事件发生了
// 将事件类型转换为事件的实际类型
auto mouseEvt = (MouseDownEvent*)evt;
mouseEvt->x; // 鼠标 x 坐标
mouseEvt->y; // 鼠标 y 坐标
mouseEvt->button; // 鼠标按键键值 MouseCode
}
else if (evt->type == Event::MouseUp)
{
// 鼠标抬起事件发生了
// 将事件类型转换为事件的实际类型
auto mouseEvt = (MouseUpEvent*)evt;
mouseEvt->x; // 鼠标 x 坐标
mouseEvt->y; // 鼠标 y 坐标
mouseEvt->button; // 鼠标按键键值 MouseCode
}
else if (evt->type == Event::MouseWheel)
{
// 鼠标滚轮滑动事件发生了
// 将事件类型转换为事件的实际类型
auto mouseEvt = (MouseWheelEvent*)evt;
mouseEvt->x; // 鼠标 x 坐标
mouseEvt->y; // 鼠标 y 坐标
mouseEvt->delta; // 鼠标滚轮滑动幅度
}
else if (evt->type == Event::KeyDown)
{
// 键盘按下事件发生了
// 将事件类型转换为事件的实际类型
auto keyEvt = (KeyDownEvent*)evt;
keyEvt->key; // 键盘按键键值 KeyCode
keyEvt->count; // 按键触发次数
}
else if (evt->type == Event::KeyUp)
{
// 键盘抬起事件发生了
// 将事件类型转换为事件的实际类型
auto keyEvt = (KeyUpEvent*)evt;
keyEvt->key; // 键盘按键键值 KeyCode
keyEvt->count; // 按键触发次数
}
};
创建监听器后,可以调用 start
和 stop
函数启动和暂停一个监听器
这个类似于Game::start……
auto lis = gcnew Listener();
// 启动监听器(默认就是启动状态)
lis->start();
// 暂停监听器
lis->stop();
创建监听器后,需要将其添加到节点上,才可以接收发送到该节点的事件:
auto lis = gcnew Listener();
// 添加监听器
node->addListener(lis);
// 移除监听器
node->removeListener(lis);
监听器可以有名字,通过名字可以启动、暂停、移除指定的监听器
auto lis = gcnew Listener();
node->addListener(lis);
// 设置监听器的名称
lis->setName(L"my_listener");
// 启动名称为 my_listener 的监听器
node->startListener(L"my_listener");
// 暂停名称为 my_listener 的监听器
node->stopListener(L"my_listener");
// 移除名称为 my_listener 的监听器
node->removeListener(L"my_listener");
也可以启动、暂停、移除一个节点上的所有监听器
// 启动所有监听器
node->startAllListeners();
// 暂停所有监听器
node->stopAllListeners();
// 移除所有监听器
node->removeAllListeners();
这部分背的很多,但是大可不必,收藏文章吃灰,用到的时候拿出来就好了
这里我们把标准的拿过来,因为博主没看懂…………
太菜了,看懂的评论区留言
出了上面几种预先定义的事件,用户也可以自己定义事件。
下面的代码展示了如何创建自定义的事件:
// 自定义事件类型
enum MyEventType
{
// 第一个类型,为预定义事件类型最后一个值 + 1
First = Event::Type::Last + 1
};
// 自定义事件
struct MyEvent
: public Event
{
// 自定义事件的类型为 First
MyEvent() : Event(MyEventType::First) {}
// 自定义事件的成员变量
int value = 0;
};
使用下面的代码将自定义事件分发给节点及其所有子节点:
// 创建自定义事件
MyEvent* evt = gcnew MyEvent;
// 设置自定义事件的成员变量
evt->value = 3;
// 分发该事件,事件会发送给节点及其所有子节点
node->dispatch(evt);
在监听器中处理自定义事件:
// 回调函数处理
auto callback = [](Event* evt)
{
// 判断事件类型是否是鼠标按下
if (evt->type == Event::MouseDown)
{
// 自定义事件发生了
// 将事件类型转换为事件的实际类型
auto myEvt = (MyEvent*)evt;
myEvt->value; // 获取自定义事件的成员变量
}
};
Easy2D 按照以下规律命名函数:
- 小驼峰式命名法则,第一个单词小写,后面的单词首字母大写,如
Window::setTitle
- 所有函数均按照
动词
+名语
形式命名,如Logger::showConsole
- 获取对象的属性值:g
et
+属性名
,如Node::getWidth
- 修改对象的属性值:
set
+属性名
,如Node::setPos
- 获取对象的状态(bool值):
is
+状态名
,如Node::isVisiable
本节课主要是讲解了Easy2D引擎实现的教程,至此该课示例的思想博主已经真真切切彻彻底底分享完了,相信大家对这个逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下,包教包会。若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!
帅的人已然点赞收藏关注,而丑的人还在犹豫,被犹豫了,快三连吧!
原创不易,还希望各位大佬支持一下
点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!
感谢每一个观看本篇文章的朋友,更多精彩敬请期待:
iecne的博客_CSDN博客-C++领域博主
文章存在借鉴,如有侵权请联系修改删除!