
- 🧛♂️iecne个人主页:点赞关注收藏评论支持哦~
- 💡每天关注iecne的作品,一起进步
- 👉本文收录专栏:【C++游戏引擎】
- 🐳希望大家多多支持🥰一起进步呀!
哈喽大家好,我是iecne,本期为大家带来的是CPP/C++【游戏引擎Easy2D】一篇打通引擎顶级类型,Listener。包教包会,快来看看吧!
引擎支持 Visual Studio 2013 及以上版本,如果你使用的是较低版本的 VS,那么你需要考虑一下更新你的编译器了
如何根据据【游戏引擎Easy2D】一文搞懂丨从各种角度详解分析监听器Listener + C++实现
本实践旨在通过多个代码的案列,让大家理解和掌握如何使用Easy2D引擎来将这四个基础类型详细的解释并且会运用
目录
【游戏引擎Easy2D】从各种角度详解分析监听器Listener + C++实现
对于编程而言,初学者最需要的不是技能,而是成就感。
如果你喜欢用 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引擎实现的教程,至此该课示例的思想博主已经真真切切彻彻底底分享完了,相信大家对这个逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下,包教包会。若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!
帅的人已然点赞收藏关注,而丑的人还在犹豫,被犹豫了,快三连吧!
原创不易,还希望各位大佬支持一下
点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:
文章存在借鉴,如有侵权请联系修改删除!