首页IT科技c++移动构造函数和移动赋值运算符(猿创征文|【C++游戏引擎Easy2D】炫酷动画来这学,位移动画构造函数让节点执行动画)

c++移动构造函数和移动赋值运算符(猿创征文|【C++游戏引擎Easy2D】炫酷动画来这学,位移动画构造函数让节点执行动画)

时间2025-06-18 12:07:08分类IT科技浏览4195
导读:🧛‍♂️iecne个人主页::iecne的学习日志...

🧛‍♂️iecne个人主页:iecne的学习日志 💡每天关注

iecne的作品            ,一起进步

💪学C++必看iecne

本文专栏【C++游戏引擎】

.

🐳希望大家多多支持🥰一起进步呀!

✨前言

共同学习                   ,加入粉丝群      ,加V:YAN_Pisces_Boom

哈喽大家好         ,我是iecne                   ,本期为大家带来的是CPP/C++【游戏引擎Easy2D】炫酷动画来这学         ,动画入门之位移动画      ,构造函数让节点执行动画            。包教包会                   ,快来看看吧!

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

任务描述

如何根据据Button制作鼠标控制按钮类

本实践旨在通过多个代码的案列                   ,让大家理解和掌握如何使用【游戏引擎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) 及以上版本                   。

什么是节点动画

什么是动画

直接修改节点的属性会立即生效                   ,体现不出时间的概念            ,也没有渐变的效果            。想让一个精灵执行一段连贯的动画   ,需要用到 Action 动画类   。

动画分为普通动画和组合动画                   。普通动画是执行一段时间                   ,达到一种效果               ,组合动画是普通动画的组合               。

目前普通动画有:

MoveTo (在一段时间内移动到指定位置)

MoveBy (在一段时间内移动到相对于当前位置的某个位置)

ScaleTo (在一段时间内缩放到指定大小)

ScaleBy (在一段时间内缩放到相对于当前大小的某个大小)

OpacityTo (在一段时间内透明度渐变到指定值)

OpacityBy (在一段时间内透明度渐变到相对于当前透明度的某个值)

FadeIn (在一段时间内透明度渐变到完全显示)

FadeOut (在一段时间内透明度渐变到完全消失)

RotateTo (在一段时间内旋转到到指定角度)

RotateBy (在一段时间内旋转到相对于当前角度的某个角度)

Delay (等待一段时间)

Animation (帧动画,只有 Sprite 可以执行该动画)

CallFunc (立即执行指定的回调函数)

组合动画有:

Sequence (组合多个动画                ,按顺序执行)

Spawn (组合多个动画                   ,同时执行)

Loop (将一个动画循环执行   ,默认无限循环            ,也可以指定循环次数)

Tip Action 不是节点                   ,它只是描述了节点需要执行的动画的过程。

一.MoveTo

MoveTo 动画可以使节点在一段时间内移动到另一个位置      ,你需要在它的构造函数中指定这个动画的持续时间和目的地                。

1.1 函数的用法

创建一个位移动画         ,2.5 秒后使节点移动到坐标 (100, 200) 处

auto moveTo = gcnew MoveTo(2.5f, Point(100, 200));

创建一个位移动画                   ,1 秒后使节点移动到坐标 (100, 100) 处

auto moveTo = gcnew MoveTo(1.0f, Point(100, 100));

创建一个位移动画         ,10 秒后使节点移动到坐标 (200, 202) 处

auto moveTo = gcnew MoveTo(10.0f, Point(200, 202));

1.2 精灵的移动

调用节点的 runAction 函数      ,可以让节点执行动画                   。如下面的代码执行后                   ,无论精灵在什么位置            ,它都会在 2.5 秒内移动到坐标 (100, 200) 处

创建一个精灵

auto sprite = gcnew Sprite();

让这个精灵执行位移动画

sprite->runAction(moveTo);

但是前提是你得有moveTo

则要在前面加上

创建一个位移动画   ,2.5 秒后使节点移动到坐标 (100, 200) 处

auto moveTo = gcnew MoveTo(2.5f, Point(100, 200));

加在一起则是

auto moveTo = gcnew MoveTo(2.5f, Point(100, 200)); auto sprite = gcnew Sprite(); sprite->runAction(moveTo);

你学会了吗?

二.MoveBy

MoveBy 动画也是位移动画                   ,它使节点朝一个方向移动一定的距离               ,你需要在它的构造函数中指定这个动画的持续时间和位移的距离   。

创建一个位移动画,2.5 秒内使节点移动横向移动 100像素

auto moveBy = gcnew MoveBy(2.5f, Vector2(100, 0));

执行这个动画后                ,节点会从它的起始位置开始                   ,在 2.5 秒内向正右方移动 100 像素

不过作者认为他的作用不大   ,可以直接用MoveTo完成

例如我们在100,100要往右100像素

则: auto moveTo = gcnew MoveTo(2.5f, Point(100, 100 + 100));

这样我们在写游戏的时候            ,便可以通过X和Y来控制某角色当前的坐标

三.实例

3.1 原做法

我之前写过一篇文章                   ,【游戏引擎Easy2D】三分钟学会游戏的控制移动      ,键盘识别详解

点击下链接观看

【游戏引擎Easy2D】三分钟学会游戏的控制移动         ,键盘识别详解

3.1.1 设置窗口

#include <easy2d/easy2d.h> using namespace easy2d; int main() { if (Game::init()) { // 设置窗口标题和窗口大小 Window::setTitle(L"Moving Man"); Window::setSize(640, 480); /* 设计游戏内容 */ Game::start(); } Game::destroy(); return 0; }

3.1.2 man类

在代码第 2 行插入一个新的类                   ,取名为 Man         ,继承 Sprite 类            。

class Man : public Sprite { public: Man() {} };

3.1.3 与Sprite联通

在 Man 的构造函数中调用父类的构造函数      ,将图片的文件名 “man.png            ” 传给 Sprite                   。

class Man : public Sprite { public: Man() { // 加载图片 this->open(L"man.png"); } };

再全部联通

#include <easy2d/easy2d.h> #include <iostream> using namespace std; using namespace easy2d; class Man : public Sprite { public: Man() { // 加载图片 this->open(L"man.png"); } }; int main() { if (Game::init()) { // 设置窗口标题和窗口大小 Window::setTitle(L"Moving Man"); Window::setSize(640, 480); // 创建场景 auto scene = gcnew Scene; // 进入该场景 SceneManager::enter(scene); // 创建一个 Man 对象 auto hero = gcnew Man; // 将 Man 添加到场景中 scene->addChild(hero); Game::start(); } Game::destroy(); return 0; }

3.1.4 实现移动

void onUpdate() { if (Input::isDown(KeyCode::Up)) { // Man 的 Y 坐标减少 2 this->movePosY(-2); } else if (Input::isDown(KeyCode::Down)) { // Man 的 Y 坐标增加 2 this->movePosY(2); } if (Input::isDown(KeyCode::Left)) { // Man 的 X 坐标减少 2 this->movePosX(-2); } else if (Input::isDown(KeyCode::Right)) { // Man 的 X 坐标增加 2 this->movePosX(2); } }

3.2 综合CODE

#include <easy2d/easy2d.h> using namespace easy2d; class Man : public Sprite { public: Man() { // 加载图片 this->open(L"man.png"); // 居中显示在屏幕上 this->setAnchor(0.5f, 0.5f); this->setPos(Window::getWidth() / 2, Window::getHeight() / 2); } void onUpdate() { if (Input::isDown(KeyCode::Up)) { // Man 的 Y 坐标减少 2 this->movePosY(-2); } else if (Input::isDown(KeyCode::Down)) { // Man 的 Y 坐标增加 2 this->movePosY(2); } if (Input::isDown(KeyCode::Left)) { // Man 的 X 坐标减少 2 this->movePosX(-2); } else if (Input::isDown(KeyCode::Right)) { // Man 的 X 坐标增加 2 this->movePosX(2); } } }; int main() { if (Game::init()) { // 设置窗口标题和窗口大小 Window::setTitle(L"Moving Man"); Window::setSize(640, 480); // 创建场景 auto scene = gcnew Scene; // 进入该场景 SceneManager::enter(scene); // 创建一个 Man 对象 auto hero = gcnew Man; // 将 Man 添加到场景中 scene->addChild(hero); Game::start(); } Game::destroy(); return 0; }

3.3 修改后

#include <easy2d/easy2d.h> #include <iostream> #include <windows.h> using namespace easy2d; int X = Window::getWidth() / 2; int Y = Window::getHeight() / 2; class Man : public Sprite { public: Man() { // 加载图片 this->open(L"people.webp"); // 居中显示在屏幕上 this->setAnchor(0.5f, 0.5f); this->setPos(X, Y); } void onUpdate() { if (Input::isDown(KeyCode::Up)) { // Man 的 Y 坐标减少 2 auto y = gcnew MoveTo(0.1f, Point(X , Y-2)); Y -= 2; this->runAction(y); } else if (Input::isDown(KeyCode::Down)) { // Man 的 Y 坐标增加 2 auto y = gcnew MoveTo(0.1f, Point(X, Y + 2)); Y += 2; this->runAction(y); } if (Input::isDown(KeyCode::Left)) { // Man 的 X 坐标减少 2 auto x = gcnew MoveTo(0.1f, Point(X -2 , Y)); X -= 2; this->runAction(x); } else if (Input::isDown(KeyCode::Right)) { // Man 的 X 坐标增加 2 this->movePosX(2); auto x = gcnew MoveTo(0.1f, Point(X + 2, Y)); X += 2; this->runAction(x); } Sleep(50); } }; int main() { if (Game::init()) { // 设置窗口标题和窗口大小 Window::setTitle(L"Moving Man"); Window::setSize(1280, 960); // 创建场景 auto scene = gcnew Scene; // 进入该场景 SceneManager::enter(scene); // 创建一个 Man 对象 auto hero = gcnew Man; // 将 Man 添加到场景中 scene->addChild(hero); Game::start(); } Game::destroy(); return 0; }

代码各自看看                   ,一定能看到其中奥秘            ,也欢迎各位copy放入自己的VS然后运行看看   ,图片不提供                   ,去百度图片找找

效果如下:

关于命名

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

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

总结

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

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

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

iecne的博客

若有任何侵权和不妥之处      ,请私信于我         ,定积极配合处理                   ,看到必回!!!
声明:本站所有文章         ,如无特殊说明或标注      ,均为本站原创发布         。任何个人或组织                   ,在未征得本站同意时            ,禁止复制            、盗用                  、采集       、发布本站内容到任何网站         、书籍等各类媒体平台                   。如若本站内容侵犯了原著者的合法权益   ,可联系我们进行处理         。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
js合并两个对象数组(JavaScript 对象合并) win11系统兼容性怎么样(Win11升级反馈:可使用Win7兼容性模式运行升级助手绕过系统兼容性测试)