猿创征文|【C++游戏引擎Easy2D】炫酷动画来这学,位移动画构造函数让节点执行动画_easy2d 人物移动-程序员宅基地

技术标签: c++  游戏引擎  前端  动画  【C++游戏引擎】  开发语言  

在这里插入图片描述


iecne


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


前言

共同学习,加入粉丝群,加V:YAN_Pisces_Boom
哈喽大家好,我是iecne,本期为大家带来的是CPP/C++【游戏引擎Easy2D】炫酷动画来这学,动画入门之位移动画,构造函数让节点执行动画。包教包会,快来看看吧!
引擎支持 Visual Studio 2013 及以上版本,如果你使用的是较低版本的 VS,那么你需要考虑一下更新你的编译器了

任务描述

如何根据据Button制作鼠标控制按钮类
本实践旨在通过多个代码的案列,让大家理解和掌握如何使用【游戏引擎Easy2D】炫酷动画来这学,动画入门之位移动画,构造函数让节点执行动画
iecne



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


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

iecne

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/CSDN_linyanchen/article/details/126451960

智能推荐

CRM是否有效?可通过这些办法判断!_crm如何判断会员唯一性-程序员宅基地

文章浏览阅读204次。CRM就是关于客户与公司销售团队之间的客户关系管理,它是一个销售人员管理工具。作为一个工具型产品,CRM能减少更多的人为错误,提高工作效率,从而达到更好的营收。如果在使用CRM期间出现以下现象:不能从不同潜在客户来源中获取潜在客户,不能将潜在客户转化为销售订单,不能提供合适的销售渠道,不能提高销售人员的工作效率。说明你使用的CRM存在问题。如何判断CRM是否有效?为了检查CRM的有效性,销售人员可以对捕获到的潜在客户和具体需求进行跟踪。销售人员能够判断这个潜在客户是否值得做进一步的跟进,或者是否应该放_crm如何判断会员唯一性

数据库三大范式_怎么理解第三范式-程序员宅基地

文章浏览阅读617次,点赞2次,收藏3次。1.第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。2. 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。3.第三范式:任何非主属性不依赖于其它非主属性。在实际的开发中需要考虑诸多问题,如:考虑商业化的需求和目标(成本,用户体验),数据库的性能更加重要在规范性能问题的时候,需要适当地考虑一下规范性有时候会故意给某些表增加一些冗余的字段(多表查询→单表查询)_怎么理解第三范式

网络安全资料-程序员宅基地

文章浏览阅读1.3k次。做安全的,这里有你意想不到的东西分类: 信息于网络安全 2011-09-05 22:03 275人阅读 评论(0)收藏 举报目录(?)[+]Blogs Worth It:Forums:Magazines:Video:Methodologies:OSINTPresentations:People and Organizational:Inf

GDAL:创建矢量线、矢量面数据_gdal创建面-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏26次。分享给有需要的人,代码质量勿喷。一、创建矢量线数据 单个要素 void xjCreateVectorLineByGDAL(QList<xjPoint> ListNode, const QString &xjSavePath) { GDALAllRegister(); OGRRegisterAll(); const char *xjDriverName =..._gdal创建面

MATLAB01:基本的数学运算与矩阵运算_matrixxd 赋值-程序员宅基地

文章浏览阅读10w+次,点赞1.6k次,收藏3.9k次。MATLAB01:基本的数学运算与矩阵运算MATLAB基本语法变量变量名保留变量不适合做变量名变量不应当覆盖内置函数MATLAB的调用优先级变量类型数字型变量的显示格式MATLAB命令行使用MATLAB进行数字运算使用MATLAB计算数学表达式MATLAB内置的数学函数使用MATLAB进行矩阵运算定义矩阵向终端输入矩阵使用冒号运算符创建向量定义特殊矩阵矩阵的索引矩阵的操作操作矩阵的运算符操作矩阵的..._matrixxd 赋值

随便推点

详述GPS原理及RTK技术应用_rtk与gps数据的融合过程-程序员宅基地

文章浏览阅读8.9k次,点赞12次,收藏100次。详述GPS原理及RTK技术应用,包括四大卫星定位系统,GPS系统组成:GPS空间部分、地面监控系统和GPS信号接收器(GPS卫星定位车载终端);GPS定位技术(WGS-84坐标系),GPS定位原理(绝对定位原理,相对定位原理,静态相对定位,动态相对定位);GPS实时动态定位技术RTK的工作原理以及基准站和流动站组成,GPS实时差分定位RTK技术的缺点,移动站的解算状态;GPS网络RTK技术(VRS系统)组成和原理,作业优势,还有GPS_NMEA 0183协议相关语句介绍。_rtk与gps数据的融合过程

CSS基础(超详解)-程序员宅基地

文章浏览阅读2.3w次,点赞103次,收藏800次。Css (层叠样式表)是种格式化网页的标准方式, 用于控制设置网页的样式,并且允许CSS样式信息与网页内容(由HTML语言定义)分离的一种技术。_css

Android 百度地图SDK 自动定位、标记定位_安卓开发地图获取定位-程序员宅基地

文章浏览阅读1.2w次,点赞98次,收藏201次。先看效果图,如果不是你想要的,也就不浪费你时间了,这样对大家都好。如果是你满意的那样,我们就可以开始写了,首先创建一个名为MapDemo的项目。打开AndroidManifest.xml,复制你的包名然后进入百度地图开放平台,没有注册的小伙伴先注册,已注册的就直接登录,登录进去之后找到控制台→我的应用→创建应用点击之后进入,填写相关资料输入了应用名称、选择了应用类型和启用的服务,输入了包名。还差开发版和发布版的SHA1了① 获取开发版SHA1鼠标点击右侧边栏的Gradle→ app→Ta_安卓开发地图获取定位

java特殊字符转html_html特殊字符转换(java)-程序员宅基地

文章浏览阅读431次。/** * 把文本编码为Html代码 * @param target * @return 编码后的字符串 */ public static String htmEncode(String target) { StringBuffer stringbuffer = new StringBuffer(); int ...

尚硅谷最新版JavaScript基础全套教程完整版(p48-p65)_尚硅谷javascript新书大纲-程序员宅基地

文章浏览阅读237次。尚硅谷最新版JavaScript基础全套教程完整版(140集实战教学,JS从入门到精通)一、基本数据类型和引用数据类型1.基本数据类型-string 、 number 、 Boolean 、null 、undefined2.引用数据类型-object3.区别-JS中的变量都是保存到栈内存中的,基本数据类型的值直接在栈内存中存储,值与值之间是独立存在的,修改一个变量不会影响另外一个变量。-引用数据类型(对象)是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟出一个新的空间,而变量保存_尚硅谷javascript新书大纲

ACM--HDOJ 2072--单词数--字符串--水_java acm单词数问题 #结束-程序员宅基地

文章浏览阅读1.2k次。HDOJ题目地址:传送门单词数Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 44934 Accepted Submission(s): 10992Problem Descr_java acm单词数问题 #结束

推荐文章

热门文章

相关标签