【C++游戏引擎Easy2D】树形模型节点详解

在这里插入图片描述


iecne


🧛‍♂️iecne个人主页:iecne的学习日志
💡每天关注iecne的作品,一起进步
💪学C++必看iecne
本文专栏【C++游戏引擎】.
🐳希望大家多多支持🥰一起进步呀!
iecne


✨前言

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++【游戏引擎Easy2D】树形模型节点详解。包教包会,快来看看吧!
引擎支持 Visual Studio 2013 及以上版本,如果你使用的是较低版本的 VS,那么你需要考虑一下更新你的编译器了

任务描述

如何根据据【游戏引擎Easy2D】树形模型节点详解 学会节点NOTE
本实践旨在通过多个代码的案列,让大家理解和掌握如何使用Easy2D引擎来将这三个基础类型详细的解释并且会运用
树


文章目录


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) 及以上版本。


一、节点的概念

1.节点的创建方式

Node 是一个抽象的含义,它表示场景中的一个元素。

auto node = gcnew Node;    
// 创建一个空节点

2.常用属性

节点的常用属性有 坐标(pos)、宽度(width)、高度(height)、缩放程度(scale)、旋转角度(rotation)、不透明度(opacity)、锚点(anchor) 等。
使用get+属性名的函数可以获取节点的属性,set+属性名的函数可以修改它的属性,如下所示。

// 使用 set + Pos 修改节点坐标
node->setPos(posX, posY);
// 可以单独设置横坐标和纵坐标
node->setPosX(posX);
node->setPosY(posY);
// 使用 get + Pos 可以获取节点坐标
Point pos = node->getPos();
float posX = node->getPosX();
float posY = node->getPosY();


二.文本用法

1.创建文本

场景中所有的元素都被称为Node(节点),比如场景中的一个按钮,或者一张图片,它们都是节点的一种。

Easy2D 提供了许多游戏中常用的节点,比如**Text(文本) Sprite(精灵) Button(按钮)**等等,你可以像创建场景一样,直接用 new 关键字创建它们

// 创建一个文本节点
auto text = new Text(L"Hello Easy2D");

格式如下:


auto 名字 = new (gcnew) Text(L"要输入的文本");

将创建好的节点加入到场景中,它将显示在画面上

// 将文本添加到场景中
scene->addChild(text);

而接下来我们讲一下内存


2.回收内存(gcnew与autorelease)

Easy2D 支持垃圾内存的自动回收,要使用这个功能,你需要使用 gcnew 代替 new 来创建对象。

// 创建一个自动回收的场景
auto scene = gcnew Scene;
// 创建一个自动回收的文本
auto text = gcnew Text(L"Hello Easy2D");

使用 new 运算符创建的对象也可以手动调用 autorelease 函数,使其可以自动被回收。

// 使用 new 创建对象
auto scene = new Scene;
// 调用 autorelease 函数,使 GC 自动对其进行回收
scene->autorelease();

因此我们一般创建一个节点用的是gcnew而不是new


三.设置名字

有时也许你需要区分不同的节点,那么可以设置它的名称

node->setName(L"name_test");    // 设置节点名称
String name = node->getName();  // 获取节点名称

比如:
String类表示一个字符串。

String str = "Hello World";

四.节点的父子结构

节点以树形模型储存,每个节点都只能有一个父节点,和任意数量的子节点,一个树状模型如下图所示。

Node::addChild函数用来添加子节点。例如,下面的代码将 node2 作为了 node1 的子节点:

auto node1 = gcnew Node;
auto node2 = gcnew Node;
node1->addChild(node2);    // 添加子节点

node1 和 node2 互为父子关系,node1 是 node2 的父节点,node2 是 node1 的子节点。当父节点被添加到场景中时,子节点也会一起进入场景,当父节点从场景中删除时,子节点也会消失。

Tips
节点的属性是向下传递的。因此,移动父节点的坐标,所有的子节点都会跟着一起移动,旋转父节点,所有的子节点会跟着一起旋转,所以你可以用 Node 实现任意形式的层次结构。

Node::removeChild函数用于删除子节点,只有当这个节点确实是子节点时,这个函数才调用成功。

// 移除子节点
node->removeChild(node2);

Node::getChildrenCount函数用于获取子节点的数量,如下所示。

// 获取子节点的数量
int num = node->getChildrenCount();

五.节点的顺序

另外,添加子节点时,先被添加的节点会被后添加的节点遮挡。例如,下面的代码中,node3 将遮挡 node2。

node1->addChild(node2);
node1->addChild(node3);

你可以在添加节点时指定它的渲染顺序。例如下面的代码,虽然 node3 在 node2 后面添加,但是 node2 的顺序为 2,比 node3 大,所以屏幕上 node2 将遮挡 node3。

node1->addChild(node2, 2);
node1->addChild(node3, 1);

根节点是树型模型最顶端的节点,场景包含了根节点,所以屏幕上所有的节点都是它的子节点。将一个精灵添加入场景,其实是把精灵加入了场景的树型模型中。Easy2D 会遍历场景的树,对树上的所有节点做出处理。
以上和树的区别不大哈,各位自己理解
ience


六.节点监听器

简单来说,当一个事件发生时,事件会逐一发送给每一个节点(node),节点再将事件转发给监听器,监听器收到事件时会调用回调函数(callback)来处理这个事件。
使用下面的代码将自定义事件分发给节点及其所有子节点:

// 创建自定义事件
MyEvent* evt = gcnew MyEvent;
// 设置自定义事件的成员变量
evt->value = 3;
// 分发该事件,事件会发送给节点及其所有子节点
node->dispatch(evt);

关于命名

Easy2D 按照以下规律命名函数:

小驼峰式命名法则,第一个单词小写,后面的单词首字母大写,如Window::setTitle
所有函数均按照动词+名语形式命名,如Logger::showConsole
获取对象的属性值:get+属性名,如Node::getWidth
修改对象的属性值:set+属性名,如Node::setPos
获取对象的状态(bool值):is+状态名,如Node::isVisiable


总结

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

帅的人已然点赞收藏关注,而丑的人还在犹豫,被犹豫了,快三连吧!
原创不易,还希望各位大佬支持一下
点赞,你的认可是我创作的动力!
收藏,你的青睐是我努力的方向!
评论,你的意见是我进步的财富!
iecne


感谢每一个观看本篇文章的朋友,更多精彩敬请期待~( ̄▽ ̄~)~:
iecne的博客
若有任何侵权和不妥之处,请私信于我,定积极配合处理,看到必回!!!

iecne

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注