jjzjj

【游戏引擎Easy2D】基于基础类型展开的监听器学习详解

iecne 2023-08-09 原文

【游戏引擎Easy2D】基于基础类型展开的监听器学习详解


  


往后看免费提供安装包

✨前言

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++【游戏引擎Easy2D】一篇打通引擎顶级类型,Listener。包教包会,快来看看吧!

引擎支持 Visual Studio 2013 及以上版本,如果你使用的是较低版本的 VS,那么你需要考虑一下更新你的编译器了

任务描述

如何根据据【游戏引擎Easy2D】一文搞懂丨从各种角度详解分析监听器Listener + C++实现

本实践旨在通过多个代码的案列,让大家理解和掌握如何使用Easy2D引擎来将这四个基础类型详细的解释并且会运用


目录

【游戏引擎Easy2D】从各种角度详解分析监听器Listener + C++实现

往后看免费提供安装包

✨前言

任务描述

Easy2D导读

安装 Easy2D

零.Listener 监听器

一.鼠标按下监听例子

二.监听器的作用

三.监听器的启动和暂停

四.监听器的添加和移除 

五.自定义事件

六.关于命名

总结


Easy2D导读

对于编程而言,初学者最需要的不是技能,而是成就感。

如果你喜欢用 C/C++ 编写自己的小游戏,那么 Easy2D 将是个不错的选择,它大大简化了游戏制作过程,可以帮助你快速开发 Windows 上的 2D 小游戏。

它的特点和它的名字一样,Everything is Easy!


安装 Easy2D

使用简易安装器

运行里面的 install.bat 文件进行安装。

点击此链接进行下载(纯免费,给官方搞成了VIP) 

下载点击这里,记得四连哦

安装程序会检测您已经安装的 Visual Studio 版本,并根据您的选择将对应库文件解压至 VS 库目录下。

Easy2D 不支持 VS2012 及以下的版本(包括 VC6.0),如果你使用的是低版本的 VS,那你需要尝试一下新版的 Visual Studio 了。

安装环境
操作系统:Windows 7 及以上操作系统。
编译环境:Visual Studio 2013 (x86 & x64) 及以上版本。


零.Listener 监听器

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
  • 获取对象的属性值:get+属性名,如Node::getWidth
  • 修改对象的属性值:set+属性名,如Node::setPos
  • 获取对象的状态(bool值):is+状态名,如Node::isVisiable

总结

 本节课主要是讲解了Easy2D引擎实现的教程,至此该课示例的思想博主已经真真切切彻彻底底分享完了,相信大家对这个逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下,包教包会。若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!

帅的人已然点赞收藏关注,而丑的人还在犹豫,被犹豫了,快三连吧!

原创不易,还希望各位大佬支持一下

点赞,你的认可是我创作的动力!

收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!


感谢每一个观看本篇文章的朋友,更多精彩敬请期待:

iecne的博客_CSDN博客-C++领域博主

文章存在借鉴,如有侵权请联系修改删除!

有关【游戏引擎Easy2D】基于基础类型展开的监听器学习详解的更多相关文章

  1. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  2. ruby-on-rails - Rails 中的推荐引擎 - 2

    我想为我的Rails网络应用程序提供推荐功能。特别是,我想向新注册的用户推荐他可能想要关注的其他用户。Rails中是否有用于此目的的引擎/gem?如果没有,我应该从哪里开始构建它?谢谢。 最佳答案 有Coletivogemhttps://github.com/diogenes/coletivo我试了一下。在MySQL上运行。Neo4jhttp://neo4j.org真的很容易实现一个“跟随谁”。事实上,大多数展示其能力的样本都涉及“跟随谁”。快速提示-只有在JRuby上运行时,Neo4j.rb才会很酷。如果不是-使用Neograph

  3. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  4. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  5. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环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

  6. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  7. kvm虚拟机安装centos7基于ubuntu20.04系统 - 2

    需求:要创建虚拟机,就需要给他提供一个虚拟的磁盘,我们就在/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

  8. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  9. ruby-on-rails - (Ruby,Rails) 基于角色的身份验证和用户管理...? - 2

    我正在寻找用于Rails的优质管理插件。似乎大多数现有的插件/gem(例如“restful_authentication”、“acts_as_authenticated”)都围绕着self注册等展开。但是,我正在寻找一种功能齐全的基于管理/管理角色的解决方案——但不是简单地附加到另一个非基于角色的解决方案。如果我找不到,我想我会自己动手......只是不想重新发明轮子。 最佳答案 RyanBates最近做了两个关于授权的railscast(注意身份验证和授权之间的区别;身份验证检查用户是否如她所说的那样,授权检查用户是否有权访问资源

  10. ruby-on-rails - lovdbyless VS 社区引擎……哪个最好? - 2

    随着ruby​​被引入为新的编程救世主,我想知道是否有人基于易用性、运行所需的资源、可用性和易定制性而有偏好。两者有更好的吗? 最佳答案 好吧,任何基于Rails的社交网络应用程序的比较都应该包括insoshi(http://portal.insoshi.com/)。话虽这么说,这三个都非常相似,区别在于实现细节。Lovd和Insoshi都是完整的Rails应用程序;它旨在供您将它们用作入门工具包,并使用您自己的自定义功能对其进行扩展。另一方面,CommunityEngine是一个Rails插件。这意味着您可以更轻松地向现有Rail

随机推荐