【游戏引擎Easy2D】一篇打通引擎进阶类型,Keycode+MouseCode+Image

【游戏引擎Easy2D】一篇打通引擎进阶类型,Keycode+MouseCode+Image


 8b354a7916f240d0bc7839822301ba90.gif#pic_center


往后看免费提供安装包

✨前言

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++【游戏引擎Easy2D】一篇打通引擎进阶类型,Keycode+MouseCode+Image。包教包会,快来看看吧!

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

任务描述

如何根据据Easy2D引擎中Keycode+MouseCode+Image四个类型来展开讲解

本实践旨在通过多个代码的案列,让大家理解和掌握如何使用Easy2D引擎来将这四个基础类型详细的解释并且会运用

d0f2517404204808b7e0d61c09870190.png


目录

【游戏引擎Easy2D】一篇打通引擎进阶类型,Keycode+MouseCode+Image

往后看免费提供安装包

✨前言

任务描述

Easy2D导读

安装 Easy2D

 一.KeyCode 键值

1)基础知识

2)实际应用

二.MouseCode 鼠标键值

三.Image 图片类和图片预加载

四.Font 字体类

 五.关于命名

总结


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) 及以上版本。


 一.KeyCode 键值

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

1)基础知识

KeyCode 枚举了键盘上几乎所有按键的键值。

对于按键类型的知识,我们可以完完全全的用本文的知识

字母键:

// 字母 A 键
KeyCode::A
// 字母 Z 键
KeyCode::Z

格式是

KeyCode::那个字母

数字键:

// 数字 0 键
KeyCode::Num0
// 数字 9 键
KeyCode::Num9

Num各位都知道吧?Number

数字小键盘键:

// 数字小键盘 0 键
KeyCode::Numpad0
// 数字小键盘 9 键
KeyCode::Numpad9

注意在写的时候,一定要加上小键盘,否则擅长小键盘的朋友会吐槽你的游戏按键坏了的

其他常用键:

// 回车
KeyCode::Enter
// 退出键
KeyCode::Esc
// 上下左右键
KeyCode::Up
KeyCode::Down
KeyCode::Left
KeyCode::Right
// 空格
KeyCode::Space

这里引用官网上的例子了,基本就是用英文构造

使用 KeyCode 配合 Input 类可以获取用户按键输入,例如:

// 获取字母 A 键是否正被按下
bool isDown = Input::isDown(KeyCode::A);

而Input类我们以后再说 

用bool类型创造isDown 然后加上Input::isDown(再加上第一部分)


2)实际应用

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

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

如上,精灵图片不提供,各位自己找找哈


二.MouseCode 鼠标键值

点赞关注评论支持,下次找到不迷路

MouseCode 枚举了鼠标的三个按键,分别是:

// 鼠标左键
MouseCode::Left
// 鼠标右键
MouseCode::Right
// 鼠标中键
MouseCode::Middle

使用 MouseCode 配合 Input 类可以获取用户按键输入,例如:

// 获取鼠标左键是否正被按下
bool isDown = Input::isDown(MouseCode::Left);

这个和2)差不多,大家自己领悟 


三.Image 图片类和图片预加载

点赞关注评论支持,下次找到不迷路

Image 表示图片,程序中使用的每一张图片都对应一个 Image 对象。

每个 Sprite 都包含一个 Image 对象,例如当你创建很多个像下图一样的 Sprite 时,它们包含的 Image 对象其实是同一个。这样做的好处就是节省内存。

 6ef8f72e68e34002acf5ddd28f08bddf.png

Image 的另一个作用就是创建Animation(帧动画),这个部分在动画教程中讲解。

将图片资源复制到内存中需要耗费一定的时间,为了避免在游戏过程中因为加载图片产生卡顿,你可以在游戏开始前调用 Image::preload 函数来提前将游戏中用到的图片加载到内存中。

Image::preload(L"图片1.png");
Image::preload(L"图片2.png");
Image::preload(L"图片3.png");

这个不重要,大家了解一下

这两部分真的和键盘的那一篇十分相关,各位去看看 


四.Font 字体类

点赞关注评论支持,下次找到不迷路

如果你想设置 Text 的字体、粗细、字号等等属性,就需要为它创建一个 Font 。

Tips

Font 不是节点,因为它仅仅描述了文本的样式。Font 不能显示在屏幕上,也不能进行旋转之类的操作。

auto text = gcnew Text(L"Hello Easy2D!");

// 创建一个字体,宋体、字号40、粗体、斜体
Font font = Font();
font.family = L"宋体";
font.size = 40;
font.weight = Font::Weight::Bold;
font.italic = true;
// 也可以用下面的代码创建字体,效果和上面一样
Font font = Font(L"宋体", 40, Font::Weight::Bold, true);

// 设置字体
text->setFont(font);

 

0cfc492c93b5ce0aadb8598a74e7bcae.png

 分步骤进行上面的操作虽然简洁明了,但是熟悉了相关操作后,上面的代码难免显得有些啰嗦。你可以直接在 Text 的构造函数中传入更多的参数来指定它的字体样式:

// 在创建文本的同时指定它的字体样式
auto text = gcnew Text(L"Hello Easy2D!", Font(L"宋体", 40, Font::Weight::Bold));

Tips

没有设置 Text 的字体时,它会自动创建一个默认字体并使用。

多个 Text 可以使用一个 Font,例如下面的代码中 text1 和 text2 使用了同一个 Font 对象。

text1 和 text2 在内部会各自拷贝一份 Font,所以创建文字后再修改 font 不会影响 text1 和 text2。

Font font = Font(L"", 40);                  // 系统默认字体、字号40
auto text1 = gcnew Text(L"Hello", font);    // text1 使用 font
auto text2 = gcnew Text(L"Easy2D", font);   // text2 也使用 font

 字体这部分实际上可以用图片省略,但是大可不必

记得字体不能乱弄,参考word吧~


 五.关于命名

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

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

总结

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

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

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

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

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

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

8727b463932d44b2acd7b0fb454a41c5.png


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

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

 

 

 

 

  • 23
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 46
    评论
### 回答1: 好的,下面是一个简单的2048小游戏的代码示例: ```html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>2048 Game</title> <style> body { font-family: Arial, sans-serif; text-align: center; } .container { display: inline-block; margin-top: 20px; border: 1px solid #ccc; box-shadow: 0 0 10px #ccc; } .row { display: flex; } .cell { width: 100px; height: 100px; margin: 5px; font-size: 2rem; font-weight: bold; text-align: center; line-height: 100px; background-color: #eee; border-radius: 5px; } .cell.empty { background-color: #ccc; color: #fff; } .cell.num2 { background-color: #eee; color: #333; } .cell.num4 { background-color: #e8e189; color: #333; } .cell.num8 { background-color: #f3b04b; color: #fff; } .cell.num16 { background-color: #f39642; color: #fff; } .cell.num32 { background-color: #f07f4f; color: #fff; } .cell.num64 { background-color: #f66d3b; color: #fff; } .cell.num128 { background-color: #f7c34f; color: #fff; } .cell.num256 { background-color: #f7bb3f; color: #fff; } .cell.num512 { background-color: #f7a92d; color: #fff; } .cell.num1024 { background-color: #f7b40e; color: #fff; } .cell.num2048 { background-color: #f7b40e; color: #fff; } </style> </head> <body> <div class="container"> <div class="row"> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> </div> <div class="row"> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> </div> <div class="row"> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> </div> <div class="row"> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> <div class="cell empty"></div> </div> </div> <script> const ROWS = 4; const COLS = 4; let board = []; function init() { for (let row = 0; row < ROWS; row++) { board[row] = []; for (let col = 0; col < COLS; col++) { board[row][col] = 0; } } } function getEmptyCells() { let cells = []; for (let row = 0; row < ROWS; row++) { for (let col = 0; col < COLS; col++) { if (board[row][col] === 0) { cells.push({row, col}); } } } return cells; } function generateNumber() { let cells = getEmptyCells(); if (cells.length > 0) { let {row, col} = cells[Math.floor(Math.random() * cells.length)]; board[row][col] = Math.random() < 0.9 ? 2 : 4; } } function updateView() { for (let row = 0; row < ROWS; row++) { for (let col = 0; col < COLS; col++) { let cell = document.querySelector(`.row:nth-child(${row + 1}) .cell:nth-child(${col + 1})`); cell.classList.remove("num2", "num4", "num8", "num16", "num32", "num64", "num128", "num256", "num512", "num1024", "num2048"); if (board[row][col] === 0) { cell.classList.add("empty"); cell.innerText = ""; } else { cell.classList.remove("empty"); cell.classList.add(`num${board[row][col]}`); cell.innerText = board[row][col]; } } } } function moveLeft() { let moved = false; for (let row = 0; row < ROWS; row++) { let prev = -1; for (let col = 0; col < COLS; col++) { if (board[row][col] !== 0) { if (prev > -1 && board[row][prev] === board[row][col]) { board[row][prev] *= 2; board[row][col] = 0; moved = true; } else { if (prev > -1) { board[row][prev + 1] = board[row][col]; board[row][col] = 0; moved = true; } else { prev = col; } } } } } return moved; } function moveRight() { let moved = false; for (let row = 0; row < ROWS; row++) { let prev = -1; for (let col = COLS - 1; col >= 0; col--) { if (board[row][col] !== 0) { if (prev > -1 && board[row][prev] === board[row][col]) { board[row][prev] *= 2; board[row][col] = 0; moved = true; } else { if (prev > -1) { board[row][prev - 1] = board[row][col]; board[row][col] = 0; moved = true; } else { prev = col; } } } } } return moved; } function moveUp() { let moved = false; for (let col = 0; col < COLS; col++) { let prev = -1; for (let row = 0; row < ROWS; row++) { if (board[row][col] !== 0) { if (prev > -1 && board[prev][col] === board[row][col]) { board[prev][col] *= 2; board[row][col] = 0; moved = true; } else { if (prev > -1) { board[prev + 1][col] = board[row][col]; board[row][col] = 0; moved = true; } else { prev = row; } } } } } return moved; } function moveDown() { let moved = false; for (let col = 0; col < COLS; col++) { let prev = -1; for (let row = ROWS - 1; row >= 0; row--) { if (board[row][col] !== 0) { if (prev > -1 && board[prev][col] === board[row][col]) { board[prev][col] *= 2; board[row][col] = 0; moved = true; } else { if (prev > -1) { board[prev - 1][col] = board[row][col]; board[row][col] = 0; moved = true; } else { prev = row; } } } } } return moved; } function gameover() { for (let row = 0; row < ROWS; row++) { for (let col = 0; col < COLS; col++) { if (board[row][col] === 0) { return false; } if (row > 0 && board[row][col] === board[row - 1][col]) { return false; } if (row < ROWS - 1 && board[row][col] === board[row + 1][col]) { return false; } if (col > 0 && board[row][col] === board[row][col - 1]) { return false; } if (col < COLS - 1 && board[row][col] === board[row][col + 1]) { return false; } } } return true; } function handleKeyDown(event) { let moved = false; switch (event.keyCode) { case 37: // left moved = moveLeft(); break; case 38: // up moved = moveUp(); break; case 39: // right moved = moveRight(); break; case 40: // down moved = moveDown(); break; } if (moved) { generateNumber(); updateView(); if (gameover()) { alert("Game over!"); } } } init(); generateNumber(); generateNumber(); updateView(); document.addEventListener("keydown", handleKeyDown); </script> </body> </html> ``` 这个代码使用了HTML、CSS和JavaScript来实现一个简单的2048游戏。其中,HTML用于定义游戏界面的布局,CSS用于定义游戏界面的样式,JavaScript则用于实现游戏的逻辑。游戏的主要逻辑包括初始化游戏、生成随机数、更新游戏界面、处理玩家输入、判断游戏是否结束等。通过这个示例,你可以了解到如何使用JavaScript+HTML+CSS来实现一个简单的小游戏。 ### 回答2: 2048是一款非常受欢迎的数字益智游戏,它的目标是通过合并相同数字的方块,最终达到数字2048。我们可以使用JavaScript、HTML5和CSS3来创建一个2048游戏。 首先,我们需要一个HTML文件来承载游戏。可以创建一个包含游戏容器和得分板的div元素,并使用CSS样式设置其样式。 接下来,在JavaScript文件中,我们需要实现游戏的逻辑。首先,我们要定义一个二维数组来表示游戏的方块。每个方块包含一个数字值和一个对应的CSS样式类。 接着,我们需要编写函数来实现游戏的核心功能。例如,可以编写一个函数来初始化游戏,用于在游戏开始时创建两个随机的方块。还可以编写函数来处理方块的合并操作,当两个相邻的方块具有相同的数字时,将它们合并为一个新的方块。还有一个函数用于处理用户的移动操作,例如按下上、下、左、右箭头键。 在样式方面,我们可以使用CSS3的动画和过渡效果来优化游戏的界面。例如,可以为方块的合并操作添加一个过渡效果,使游戏更加流畅和有趣。 最后,我们需要在HTML文件中包含JavaScript文件,并在页面加载时调用初始化函数,以启动游戏。 总结来说,使用JavaScript、HTML5和CSS3来编写一个2048游戏需要以下步骤:创建HTML文件来承载游戏,通过JavaScript实现游戏的逻辑和功能,使用CSS3的样式和动画来美化游戏界面。通过这些步骤,我们可以成功地创建一个简单并有趣的2048游戏。 ### 回答3: 2048游戏是一款数字益智类游戏,我们可以使用JavaScript、HTML5和CSS3来实现它。 首先,我们可以使用HTML5创建游戏的基本布局。可以使用<div>元素来表示游戏的方格,并使用CSS3对其进行样式设置,包括大小、背景颜色和边框等。 接下来,我们可以使用JavaScript编写游戏逻辑。可以使用一个二维数组来表示游戏的方格,通过监听用户键盘操作来实现方格的上下左右移动。在移动方格的过程中,需要判断两个相邻方格的数字是否相等,如果相等则合并它们,并更新得分。 除了移动方格,我们还需要在游戏过程中随机生成新的方格,并在合适的位置显示。使用JavaScript的Math.random()函数来生成一个随机数,然后根据随机数在空白的方格中显示新的数字。 在游戏过程中,我们还可以根据每个方格的数字大小来改变方格的颜色,并在数字超过2048时显示胜利界面。 最后,我们可以为游戏添加一些特效和动画效果,以增加游戏的趣味性。比如在方格合并时添加动画效果,或者在游戏结束时显示失败界面。 总之,使用JavaScript、HTML5和CSS3来实现2048游戏是完全可行的。通过合理的布局、逻辑和样式设置,我们可以实现一个功能完善、界面美观的2048游戏。
评论 46
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值