草庐IT

【游戏引擎Easy2D】 学C++还不会文字旋转?如此炫酷的技巧来这学

iecne 2023-04-18 原文

目录

✨前言

准备 

显示文本

1)创建Text

2)居中显示

动画的实现

完整代码

 关于命名

总结

 


✨前言

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++游戏引擎Easy2D教程 —— 旋转的文字,包教包会,快来看看吧!

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

 


准备 

在 VS 中写好我们新手入门里学习的基本代码,运行后显示一个 300*300 大小的窗口。

#include <easy2d/easy2d.h>

using namespace easy2d;

int main()
{
    if (Game::init())
    {
        // 设置窗口标题和窗口大小
        Window::setTitle(L"Rotating Text");
        Window::setSize(300, 300);

        /* 设计游戏内容 */

        Game::start();
    }
    Game::destroy();
    return 0;
}

记得加上iostream 和 std,必要的时候可以用到

#include <easy2d/easy2d.h>
#include <iostream>

using namespace std;
using namespace easy2d;

int main()
{
    if (Game::init())
    {
        // 设置窗口标题和窗口大小
        Window::setTitle(L"Rotating Text");
        Window::setSize(300, 300);

        /* 设计游戏内容 */

        Game::start();
    }
    Game::destroy();
    return 0;
}

这基本上就是一个固定的框架,基本不需要改变 


显示文本

1)创建Text

设计游戏内容的部分,创建一个场景和一个 Text 对象,然后文本添加到场景中。

#include <easy2d/easy2d.h>

using namespace easy2d;

int main()
{
    if (Game::init())
    {
        // 设置窗口标题和窗口大小
        Window::setTitle(L"Rotating Text");
        Window::setSize(300, 300);

        // 创建场景
        auto scene = gcnew Scene;
        // 进入该场景
        SceneManager::enter(scene);

        // 创建一个 Text 对象
        auto test = gcnew Text(L"Hello Easy2D!");
        // 将 Text 添加到场景中
        scene->addChild(test);

        Game::start();
    }
    Game::destroy();
    return 0;
}

格式如下:

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

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


2)居中显示

用我们在新手入门中学到的方法,修改文本中心点和文本坐标,让它在屏幕上居中显示

我们上节课学习了坐标来控制精灵,我们复习一下

 现在我们想完整地看到精灵,可以把精灵向右下方移动宽度和高度的一半,这样整个精灵就显示在屏幕中了。

Node::getWidthNode::getHeight函数可以获取节点的宽度和高度,如下所示

// 获取精灵的宽度
float width = sprite->getWidth();
// 获取精灵高度
float height = sprite->getHeight();

Node::setPos 函数用来直接设置节点在屏幕上的位置,它需要两个 float 类型的参数,分别表示节点的 x 坐标和 y 坐标。

// 移动精灵的位置
sprite->setPos(width / 2, height / 2);

 节点的中心点为它的正中心时,如果把它的 x 坐标设置为屏幕宽度的一半,y 坐标设置为屏幕高度的一半,那么它将显示在屏幕正中央。

// 获取窗口宽度
float width = Window::getWidth();
// 获取窗口高度
float height = Window::getHeight();
// 移动精灵到屏幕中央
sprite->setPos(width / 2, height / 2);

 所以代码如下:

#include <easy2d/easy2d.h>

using namespace easy2d;

int main()
{
    if (Game::init())
    {
        // 设置窗口标题和窗口大小
        Window::setTitle(L"Rotating Text");
        Window::setSize(300, 300);

        // 创建场景
        auto scene = gcnew Scene;
        // 进入该场景
        SceneManager::enter(scene);

        // 创建一个 Text 对象
        auto text = gcnew Text(L"Hello Easy2D!");
        // 将 Text 添加到场景中
        scene->addChild(text);

        // 居中显示在屏幕上
        text->setAnchor(0.5f, 0.5f);
        text->setPos(Window::getWidth() / 2, Window::getHeight() / 2);

        Game::start();
    }
    Game::destroy();
    return 0;
}

运行后的结果如下图所示

 


动画的实现

实现动画有很多种方式,我们使用一个新概念来实现这个功能,它的名字叫 Action(动作)。

Action 可以让一个节点动起来,它有许多的派生类,分别实现不同的效果。例如 RotateTo 可以让节点在一定时间内旋转至一定的角度,它的构造函数需要两个 float 类型的参数,一个代表动作时长(秒),另一个代表旋转后的角度。

// 创建一个旋转动画,3 秒后旋转至 180 度
auto rotate = gcnew RotateTo(3, 180);

Node::runAction 可以让节点执行一个动作,添加下面的代码并运行,可以看到文本慢慢旋转至了 180 度。

// 让 Text 执行这个动作
text->runAction(rotate);

为了让节点不停地旋转,我们不使用 RotateTo 这个动作,而是使用 RotateBy。RotateBy 也是旋转动画,它与 RotateTo 不同的是,它表示一段相对的旋转。

我们刚刚测试的动画,无论节点一开始的角度是多少,它 3 秒后都旋转到 180 度。也就是说,这个动画运行的结果是一定的,那就是文本倒立显示在屏幕上。

 

而 RotateBy 动画是一段相对动画,如果节点一开始的角度是 20 度,那么 3 秒后它将旋转到 200 度(20+180=200)。

删掉刚刚创建的旋转动画,重新创建一段 RotateBy 动画

// 创建一个旋转动画,1 秒内顺时针旋转 60 度
auto rotate = gcnew RotateBy(1, 60);

 但这个动画也不是无限运行的,它 1 秒钟后就会结束。

Loop 用来创建一段循环动画,它可以让另一个动作不断的执行。

// 创建一个循环动画
auto action = gcnew Loop(rotate);

执行这个动画,文本将一直旋转,永远都不会停下来。

// 让 Text 执行这个动作
text->runAction(action);

完整代码

#include <easy2d/easy2d.h>
#include <iostream>

using namespace std;
using namespace easy2d;

int main()
{
    if (Game::init())
    {
        // 设置窗口标题和窗口大小
        Window::setTitle(L"Rotating Text");
        Window::setSize(300, 300);

        // 创建场景
        auto scene = gcnew Scene;
        // 进入该场景
        SceneManager::enter(scene);

        // 创建一个 Text 对象
        auto text = gcnew Text(L"Hello Easy2D!");
        // 将 Text 添加到场景中
        scene->addChild(text);

        // 居中显示在屏幕上
        text->setAnchor(0.5f, 0.5f);
        text->setPos(Window::getWidth() / 2, Window::getHeight() / 2);

        // 创建一个旋转动画,1 秒内顺时针旋转 60 度
        auto rotate = gcnew RotateBy(1, 60);
        // 创建一个循环动画
        auto action = gcnew Loop(rotate);
        // 让 Text 执行这个动作
        text->runAction(action);

        Game::start();
    }
    Game::destroy();
    return 0;
}

 关于命名

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

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

总结

 本节课主要是讲解了Easy2D引擎实现的教程,至此该课示例的思想博主已经真真切切彻彻底底分享完了,相信大家对这个逻辑有了一定的理解,大家可以自己动手敲敲代码,感受一下,包教包会。

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

 

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

 

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

 

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

 

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

 


  感谢每一个观看本篇文章的朋友,更多精彩敬请期待:iecne的博客_CSDN博客-C++保姆级入门教程领域博主

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

 

 

 

有关【游戏引擎Easy2D】 学C++还不会文字旋转?如此炫酷的技巧来这学的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. 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

  3. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

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

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

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

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

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

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

  7. 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

  8. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

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

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

  10. ruby-on-rails - 使用 javascript 更改数据方法不会更改 ajax 调用用户的什么方法? - 2

    我遇到了一个非常奇怪的问题,我很难解决。在我看来,我有一个与data-remote="true"和data-method="delete"的链接。当我单击该链接时,我可以看到对我的Rails服务器的DELETE请求。返回的JS代码会更改此链接的属性,其中包括href和data-method。再次单击此链接后,我的服务器收到了对新href的请求,但使用的是旧的data-method,即使我已将其从DELETE到POST(它仍然发送一个DELETE请求)。但是,如果我刷新页面,HTML与"new"HTML相同(随返回的JS发生变化),但它实际上发送了正确的请求类型。这就是这个问题令我困惑的

随机推荐