草庐IT

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

iecne 2023-06-26 原文

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


 


目录

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

✨前言

任务描述

Easy2D导读

一.准备 

1.准备图片

2.设置窗口

二.创建 Man 类

1.man类

2.与Sprite联通

3.添加场景

4.居中显示

三.实现移动 

1.onUpdate

2.KeyCode::up 、Input::isDown

3.提取坐标

四.完整代码

1.不可同时移动CODE

2.可同时移动CODE

精灵图片这里不提供,各位自己找找哈

 关于命名

总结

 


往后看免费提供安装包

✨前言

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++ 【游戏引擎Easy2D】三分钟学会游戏的控制移动,键盘识别详细,包教包会,快来看看吧!

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

​​

任务描述

如何根据据Easy2D引擎中的提取键盘信息来控制精灵,也是图像移动,来传给 Sprite

本实践旨在通过一个小程序的案列,让大家理解和掌握如何使用Easy2D引擎来写一个游戏(程序)代码的详解


Easy2D导读

对于编程而言,初学者最需要的不是技能,而是成就感。

如果你喜欢用 C/C++ 编写自己的小游戏,那么 Easy2D 将是个不错的选择,它大大简化了游戏制作过程,可以帮助你快速开发 Windows 上的 2D 小游戏。

它的特点和它的名字一样,Everything is Easy!

 安装 Easy2D

使用简易安装器

运行里面的 install.bat 文件进行安装。

 点击此链接进行下载(纯免费) 

下载点击这里,记得四连哦

安装程序会检测您已经安装的 Visual Studio 版本,并根据您的选择将对应库文件解压至 VS 库目录下。

Easy2D 不支持 VS2012 及以下的版本(包括 VC6.0),如果你使用的是低版本的 VS,那你需要尝试一下新版的 Visual Studio 了。

安装环境
操作系统:Windows 7 及以上操作系统。
编译环境:Visual Studio 2013 (x86 & x64) 及以上版本。


一.准备 

关注点赞收藏评论支持,现在开始我们的旅途

1.准备图片

学会了 Easy2D 的基本操作之后,我们来制作一个简单的小程序,按上下左右键移动画面中的小人。

先准备一张人物的图片,将它拷贝到工程目录下,重命名为 man.png。


2.设置窗口

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

 

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

#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;
}

加上我们万语言之王之一的——Cpp 基本头文件以及命名

上代码:

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

using namespace std;
using namespace easy2d;

int main()
{
    if (Game::init())
    {
        // 设置窗口标题和窗口大小
        Window::setTitle(L"Moving Man");
        Window::setSize(640, 480);

        /* 设计游戏内容 */

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

二.创建 Man 类

1.man类

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

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

2.与Sprite联通

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

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

3.添加场景

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

添加后的完整代码如下所示

#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;
}

运行后,程序将显示一个人物图片。


4.居中显示

我们用新手入门学过的方法,把居中的代码写在 Man 的构造函数中,让 Man 在屏幕上居中显示。

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);
    }
};

运行后的效果如下图所示

三.实现移动 

接下来又新的知识

1.onUpdate

给 Man 类添加一个名称为 onUpdate 的函数,返回值类型为 void,参数为空

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()
    {
        // onUpdate 函数
    }
};

2.KeyCode::up 、Input::isDown

onUpdate 是一个特殊的函数,它在每一帧画面刷新前被 Easy2D 自动调用,所以这个函数在一秒钟里会被调用 60 次左右。我们可以在这个函数里判断有没有按键按下。

Input 类用来获取用户的输入,Input::isDown 函数用来判断一个键是否正被按下,这个函数需要一个 int 类型的参数,这个参数代表键盘上的一个键。

KeyCode 类枚举了常用按键的键值,例如 KeyCode::Up 代表上键。你可以用下面的代码判断上键是否被按下:

void onUpdate()
{
    if (Input::isDown(KeyCode::Up))
    {
        // 上键被按下
    }
    else
    {
        // 上键没被按下
    }
}

3.提取坐标

上键被按下时,我们先获取 Man 当前的 Y 坐标,然后重新设置它的 Y 坐标为当前值减 2,这样就实现了按上键向上移动的功能。

void onUpdate()
{
    if (Input::isDown(KeyCode::Up))
    {
        // 获取当前 Y 坐标
        float y = this->getPosY();
        // 重新设置它的坐标
        this->setPosY(y - 2);
    }
}

Node 类的 Node::movePos 函数可以直接移动节点,所以上面的代码可以简写成

void onUpdate()
{
    if (Input::isDown(KeyCode::Up))
    {
        // Man 的 Y 坐标减少 2
        this->movePosY(-2);
    }
}

同理,可以将其他三个按键的判断也加入到 onUpdate 函数中

void onUpdate()
{
    if (Input::isDown(KeyCode::Up))
    {
        // Man 的 Y 坐标减少 2
        this->movePosY(-2);
    }

    if (Input::isDown(KeyCode::Down))
    {
        // Man 的 Y 坐标增加 2
        this->movePosY(2);
    }

    if (Input::isDown(KeyCode::Left))
    {
        // Man 的 X 坐标减少 2
        this->movePosX(-2);
    }

    if (Input::isDown(KeyCode::Right))
    {
        // Man 的 X 坐标增加 2
        this->movePosX(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);
    }
}

二选一哈

运行游戏,一个按上下左右移动的小人就完成了!


四.完整代码

以下代码二选一

1.不可同时移动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;
}

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);
        }
        if (Input::isDown(KeyCode::Down))
        {
            // Man 的 Y 坐标增加 2
            this->movePosY(2);
        }

        if (Input::isDown(KeyCode::Left))
        {
            // Man 的 X 坐标减少 2
            this->movePosX(-2);
        }
        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;
}

记得加上精灵(图片)哦!

精灵图片这里不提供,各位自己找找哈


 关于命名

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

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

总结

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

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

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

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

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

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


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

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

 

 

 

有关【游戏引擎Easy2D】三分钟学会游戏的控制移动,键盘识别详解的更多相关文章

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

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

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

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

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

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

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

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

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

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

  7. ruby-on-rails - lovdbyless VS 社区引擎……哪个最好? - 2

    随着ruby​​被引入为新的编程救世主,我想知道是否有人基于易用性、运行所需的资源、可用性和易定制性而有偏好。两者有更好的吗? 最佳答案 好吧,任何基于Rails的社交网络应用程序的比较都应该包括insoshi(http://portal.insoshi.com/)。话虽这么说,这三个都非常相似,区别在于实现细节。Lovd和Insoshi都是完整的Rails应用程序;它旨在供您将它们用作入门工具包,并使用您自己的自定义功能对其进行扩展。另一方面,CommunityEngine是一个Rails插件。这意味着您可以更轻松地向现有Rail

  8. ruby - 如何通过Middleman安装和使用Slim模板引擎 - 2

    一般来说,我是Middleman和ruby​​的新手。我已经安装了Ruby我已经安装了Middleman和gem以使其运行。我需要使用slim而不是默认的模板系统。所以我安装了Slimgem。Slim的网站只说我需要'slim'才能让它工作。中间人网站说我只需要在config.rb文件中添加模板引擎,但是没有给出例子...对于没有ruby​​背景的人来说,这没有帮助。我在git上找了几个config.rb,它们都有:require'slim'和#Setslim-langoutputstyleSlim::Engine.set_default_options:pretty=>true#Se

  9. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

  10. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

随机推荐