猿创征文|【C++游戏引擎Easy2D】炫酷动画来这学,位移动画构造函数让节点执行动画

news2024/11/18 17:37:22

在这里插入图片描述


iecne


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


✨前言

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

任务描述

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


文章目录

  • ✨前言
    • 任务描述
  • Easy2D导读
  • 安装 Easy2D
  • 什么是节点动画
  • 一.MoveTo
    • 1.1 函数的用法
    • 1.2 精灵的移动
  • 二.MoveBy
  • 三.实例
    • 3.1 原做法
      • 3.1.1 设置窗口
      • 3.1.2 man类
      • 3.1.3 与Sprite联通
      • 3.1.4 实现移动
    • 3.2 综合CODE
    • 3.3 修改后
  • 关于命名
  • 总结


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/409460.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

from origin ‘null‘ has been blocked by CORS policy: Cross origin requests are only supported for ...

跨源资源请求问题解决方案 问题描述&#xff1a;当我们在vsCode中使用 open in brower插件打开html文件文件时&#xff0c;就会报错 xxx已被CORS策略阻止&#xff0c;引入的资源还会失效。 解决办法1 :Live Server插件 在vsCode的插件市场中搜索并安装Live Server插件&#x…

Axios

Axios是Ajax的一个框架&#xff0c;简化Ajax操作 一、基本操作 Axios执行Ajax的操作&#xff1a; 1. 添加axios的js文件 <script language"JavaScript" src"script/axios.min.js"></script> 2.1 客户端向服务端异步发送普通参数值 格式&am…

vue-router报错: uncaught error during route navigation

bug场景&#xff1a; H5项目中,浏览器流程走的通,ios流程走得通,安卓机有的可以有的不行 报错信息&#xff1a; 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 例如&#xff1a;数据传输过程中数据不时出现丢失的情况&#xff0c;偶尔会丢失一部分数据 APP 中接收数…

尚融宝06-ECMAScript基本介绍和使用

目录 一、ECMAScript 1、ECMA 2、ECMAScript 3、什么是 ECMA-262 4、ECMA-262 历史 5、ECMAScript 和 JavaScript 的关系 二、基本语法 1、let声明变量 2、const声明常量 3、解构赋值 4、模板字符串 5、声明对象简写 6、定义方法简写 7、参数的默认值 8、对象拓…

less变量

Less变量一、Less简介二、Less中的变量三、less外部引入一、Less简介 1.Less是一门css的预处理语言&#xff0c;less是一个css的增强版&#xff0c;通过less可以编写更少的代码实现更强大的样式。 变量名以两条短横线命名 例如&#xff1a; --color&#xff1a;red 2.Less特…

vue的created函数中方法执行的顺序设置方法

1.vue的created钩子函数中&#xff0c;方法的执行顺序 1.1情景&#xff1a;vue框架中通常在created钩子函数里执行访问数据库的方法&#xff0c;然后返回数据给前端&#xff0c;前端data中定义全局变量接收数据 1.2误区&#xff1a;我们可能会思考按照自己设定好的逻辑走&…

使用uni-app的uni.chooseImage获取的图片路径,存储到数据库中,无法在前端展示该路径的图片

html,js,uni-app, 首先我在uni-app中使用如下方法添加图片 uni.chooseImage({count: 1, //count: 6, //默认9sizeType: [original, compressed], //可以指定是原图还是压缩图&#xff0c;默认二者都有sourceType: [album], //从相册选择success: function(res) {console.log(…

【vue2】vue2中的性能优化(持续更新中)

⭐ v-for 遍历避免同时使用 v-if ⭐ v-for 中的key绑定唯一的值 ⭐ v-show与v-if对性能的影响 ⭐ 妙用计算属性 ⭐ 使用防抖与节流控制发送频率 ⭐ 路由守卫处理请求避免重复发送请求 ⭐ 使用第三方UI库的引入方式 【前言】 该系列是博主在使用vue2开发项目中常用上的一…

JavaScript ,18种常用数组方法,快来看看你会吗?

前言 众所周知&#xff0c;向后端请求数据&#xff0c;处理数据是前端工程师必备的技能&#xff0c;从后端请求回来的数据往往是数组的形式返回到前端&#xff0c;因此数组处理方法的重要性可想而知&#xff1b;数组的处理方法在MDN文档上很多&#xff0c;很多朋友在学习时往往…

vue配置代理服务器proxy

一、跨域。 跨域本质是浏览器基于同源策略的一种安全手段 所谓同源&#xff08;即指在同一个域&#xff09;具有以下三个相同点 协议相同&#xff08;protocol&#xff09;主机相同&#xff08;host&#xff09;端口相同&#xff08;port&#xff09; 非同源请求&#xff0c…

vue集成海康h5player实现播放

文章目录前言准备工作视频demo官方文档官方工具开源工具开始开发效果问题点前言 本篇章只针对官方提供个h5player工具&#xff0c;做播放和分屏demo。 当然本篇章也是针对已经接触了海康视频对接的开发者。 准备工作 视频demo 官方文档 API https://open.hikvision.com/d…

Not allowed to load local resource: file:///,浏览器禁止访问浏览器图片,文件解决方法

Not allowed to load local resource: file… 错误出现原因&#xff1a;浏览器出于安全考虑禁止直接读取本机文件(链接以file:///开头)&#xff0c; 解决办法&#xff1a; 创建一个web服务器&#xff0c;将文件放在这个服务器里&#xff0c;让文件有一个在线地址&#xff08…

【小程序项目开发-- 京东商城】uni-app之商品列表页面 (下)

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f310; 推荐一款找工作神器网站: 点击跳转牛客网 |笔试题库|面试经验|实习招聘内推| 还没有账户的小伙伴 速速点击链接…

推荐几个优秀的echarts 图表网站,让你轻松搞定全部报表

1.PPChart - 让图表更简单让图表更简单。PPChart 提供 Echarts 收录、图表制作等服务http://ppchart.com/#/ 2.https://madeapie.com/#/echarts图表制作&#xff0c;Make A Pie&#xff0c;Made A Pie&#xff0c;echarts案例分享&#xff0c;echarts教程分享https://madeapie…

PHP连接数据库MySQL打造xxx管理系统,实现简单的增删改查功能

目录 前言 概述 内容 创建数据库表 实现列表 新增用户 删除用户 编辑用户 前言 最近刚学完PHP和Mysql,历时半个多月时间完成了这样一个简单的算是人员管理系统吧&#xff0c;为了加深印象总结一下&#xff0c;还有很多不足之处&#xff0c;希望大家多多指正&#xff0c;一…

vue点击变色

vue点击一个遍历后元素改变其颜色的方法&#xff0c;有两种情况&#xff0c;第一种是点击单行元素变色&#xff0c;点击另一行元素时&#xff0c;原来变色的元素变回原来的颜色&#xff0c;始终只有一行元素是变色的&#xff0c;第二种情况是点击后永久变色&#xff0c;点击其他…

手把手教你部署前端项目

手把手教你部署前端项目 1.1 用Vue-cli构建简易前端项目 1.1.1 安装 Vue CLI 包 打开命令行工具&#xff0c;执行下列命令来安装 Vue CLI 包&#xff1a; npm install -g vue/cli可以用下面的命令查看是否安装成功&#xff1a; vue --version1.1.2 创建一个项目 新建一个…

背景图片相关应用-铺满,自适应

1.首先了解一下背景相关属性 background-color&#xff1a; 颜色。 background-position&#xff1a; 位置。 数值&#xff0c;或者top,right,bottom,left等&#xff0c;center&#xff1a;距离页面左边的定位&#xff0c;0px&#xff1a;距离页面上面的定位 background-si…

Cesium3Dtilesets 使用customShader的解读以及泛光效果示例

前言&#xff1a;光带原理在旋转弹跳四棱锥这篇文章里早已经阐述过&#xff0c;但还是有不少靓仔靓女可能会感到疑惑&#xff0c;在3Dtilesets里怎么使用&#xff1f;为啥我在网上看到的为数不多的代码示例我看不懂&#xff1f;是由于没理解透彻导致的。借此机会&#xff0c;提…

SocketIO介绍+SpringBoot整合SocketIO完成实时通信

Socket.IO笔记 即时通信是基于TCP长连接&#xff0c;建立连接之后&#xff0c;客户段/服务器可以无限次随时向对端发送数据&#xff0c;实现服务器数据发送的即时性 HTTP HTTP是短链接&#xff0c;设计的目的是减少服务器的压力 HTTP伪即时通讯 轮询 emmet长轮询 long pulling…