
- 🧛♂️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引擎实现的教程,至此该课示例的思想博主已经真真切切彻彻底底分享完了,相信大家对这个逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下,包教包会。若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!
帅的人已然点赞收藏关注,而丑的人还在犹豫,被犹豫了,快三连吧!
原创不易,还希望各位大佬支持一下
点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!

感谢每一个观看本篇文章的朋友,更多精彩敬请期待:
文章存在借鉴,如有侵权请联系修改删除!
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我想为我的Rails网络应用程序提供推荐功能。特别是,我想向新注册的用户推荐他可能想要关注的其他用户。Rails中是否有用于此目的的引擎/gem?如果没有,我应该从哪里开始构建它?谢谢。 最佳答案 有Coletivogemhttps://github.com/diogenes/coletivo我试了一下。在MySQL上运行。Neo4jhttp://neo4j.org真的很容易实现一个“跟随谁”。事实上,大多数展示其能力的样本都涉及“跟随谁”。快速提示-只有在JRuby上运行时,Neo4j.rb才会很酷。如果不是-使用Neograph
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/opt目录下创建一个10G大小的raw格式的虚拟磁盘CentOS-7-x86_64.raw命令格式:qemu-imgcreate-f磁盘格式磁盘名称磁盘大小qemu-imgcreate-f磁盘格式-o?1.创建磁盘qemu-imgcreate-fraw/opt/CentOS-7-x86_64.raw10G执行效果#ls/opt/CentOS-7-x86_64.raw2.安装虚拟机使用virt-install命令,基于我们提供的系统镜像和虚拟磁盘来创建一个虚拟机,另外在创建虚拟机之前,提前打开vnc客户端,在创建虚拟机的时候,通过vnc
修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为
我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源
随着ruby被引入为新的编程救世主,我想知道是否有人基于易用性、运行所需的资源、可用性和易定制性而有偏好。两者有更好的吗? 最佳答案 好吧,任何基于Rails的社交网络应用程序的比较都应该包括insoshi(http://portal.insoshi.com/)。话虽这么说,这三个都非常相似,区别在于实现细节。Lovd和Insoshi都是完整的Rails应用程序;它旨在供您将它们用作入门工具包,并使用您自己的自定义功能对其进行扩展。另一方面,CommunityEngine是一个Rails插件。这意味着您可以更轻松地向现有Rail