jjzjj

【游戏引擎Easy2D实战】选择关卡场景示例

iecne 2024-02-29 原文

哈喽大家好,我是iecne,本期为大家带来的是CPP/C++游戏编写 —— 选择关卡场景示例 ,包教包会,快来看看吧!

本片文章所用到的是Easy2D引擎,快点赞收藏关注评论支持以下博主,蟹蟹

// 编译环境:Visual Studio 2019 / Easy2D v2.0.4
// 项目类型:Win32 Console Application

首先说明本文所引用的资料出处于,注重原创     

LevelSelectExample-Easy2D 发行版 - Gitee.comz

//---------------------------------------------------------
// 程序名称:关卡选择场景
// 作者:Nomango
// 编译环境:Visual Studio 2019 / Easy2D v2.0.0-beta7
// 编译环境:Visual Studio 2019 / Easy2D v2.0.4
// 项目类型:Win32 Console Application
//---------------------------------------------------------

 


目录

一.主函数说明

在 Win32 程序下使用 Easy2D

二.头文件与函数声明

三.主函数

四.函数

1.创建场景并进入

2.关卡

Jungle 

CHINA

Egypt

3.加载按钮

4.移动关卡面板

5.点击按钮

左LEFT

右RIGHT

五.效果图片

六.总结


一.主函数说明

在 Win32 程序下使用 Easy2D

引擎在 Win32 应用程序和 Win32 控制台程序下的代码是一样的,只是两种模式下主函数的写法不同。

写控制台程序时,只需声明 main 函数就可以:

int main()
{
	return 0;
}

写 Win32 程序时,主函数变得有些复杂,但我们可以把它和控制台下的 main 函数一样使用:

int WINAPI WinMain(
	HINSTANCE hInstance, 
	HINSTANCE hPrevInstance, 
	LPSTR lpCmdLine, 
	int nCmdShow
)
{
	return 0;
}

虽然引擎支持在控制台程序下工作,但是不推荐这样使用,因为游戏并不需要控制台。


二.头文件与函数声明

#include <easy2d/easy2d.h>

using namespace easy2d;


//---------------------------------------------------------
// 函数声明
//---------------------------------------------------------

void EnterScene();		
// 创建场景并进入

void InitJungle();		
// 加载 Jungle 关卡

void InitChina();		
// 加载 China 关卡

void InitEgypt();		
// 加载 Egypt 关卡

void InitButton();		
// 加载按钮

void MovePanel();		
// 移动关卡面板

void ClickLeft();		
// 点击左按钮

void ClickRight();		
// 点击右按钮



//---------------------------------------------------------
// 全局变量声明
//---------------------------------------------------------

Scene*	g_Scene;		// 场景

Node*	g_Panel;		// 关卡面板

int		g_Level;		// 当前选中的关卡数

Button* g_LeftButton;	// 左按钮

Button* g_RightButton;	// 右按钮

三.主函数

刚刚已经讲了主函数哈

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
	if (Game::init(L"关卡选择", 480, 720))
	{
		// 设置节点默认中心点
		Node::setDefaultAnchor(0.5f, 0.5f);

		// 创建场景并进入
		EnterScene();

		Game::start();
	}

	Game::destroy();
	return 0;
}

游戏开始->结束


四.函数

重点部分哈

1.创建场景并进入

void EnterScene()
{
	// 创建一个空场景
	g_Scene = gcnew Scene;

	// 设置当前关卡为 0
	g_Level = 0;

	// 创建背景图对象
	auto background = gcnew Sprite(L"res/LS00.png");

	// 背景图居中显示
	background->setPos(Window::getSize() / 2);

	// 缩小背景图
	background->setScale(1.0f, 1.0f);

	// 将图片添加到场景中
	g_Scene->addChild(background);

	// 三个关卡图片合并为 panel 节点
	g_Panel = gcnew Node();
	g_Scene->addChild(g_Panel);

	// 加载关卡图片
	InitJungle();
	InitChina();
	InitEgypt();

	// 添加按钮
	InitButton();

	// 进入场景
	SceneManager::enter(g_Scene);
}

2.关卡

Jungle 

void InitJungle()
{
	// 创建图片
	auto JungleImage = gcnew Sprite(L"res/LS13.png");
	JungleImage->setScale(1.5f, 1.5f);
	JungleImage->setPosY(Window::getHeight() / 2 - 60);

	// 创建文字
	auto JungleText = gcnew Sprite(L"res/LS10.png");
	JungleText->setScale(1.5f, 1.5f);
	JungleText->setPosY(Window::getHeight() - 195);

	// 图片居中
	JungleImage->setPosX(Window::getWidth() / 2);
	JungleText->setPosX(JungleImage->getPosX());

	// 将两个精灵添加到 panel 节点
	g_Panel->addChild(JungleImage);
	g_Panel->addChild(JungleText);
}

CHINA

void InitChina()
{
	// 创建图片
	auto ChinaImage = gcnew Sprite(L"res/LS14.png");
	ChinaImage->setScale(1.5f, 1.5f);
	ChinaImage->setPosY(Window::getHeight() / 2 - 30);

	// 创建文字
	auto ChinaText = gcnew Sprite(L"res/LS11.png");
	ChinaText->setScale(1.5f, 1.5f);
	ChinaText->setPosY(Window::getHeight() - 195);

	// 图片居中
	ChinaImage->setPosX(Window::getWidth() / 2 + Window::getWidth());
	ChinaText->setPosX(ChinaImage->getPosX());


	// 将两个精灵添加到 panel 节点
	g_Panel->addChild(ChinaImage);
	g_Panel->addChild(ChinaText);
}

Egypt

void InitEgypt()
{
	// 创建图片
	auto EgyptImage = gcnew Sprite(L"res/LS15.png");
	EgyptImage->setScale(1.5f, 1.5f);
	EgyptImage->setPosY(Window::getHeight() / 2 - 30);

	// 设置文字位置
	auto EgyptText = gcnew Sprite(L"res/LS12.png");
	EgyptText->setScale(1.5f, 1.5f);
	EgyptText->setPosY(Window::getHeight() - 195);

	// 图片居中
	EgyptImage->setPosX(Window::getWidth() / 2 + Window::getWidth() * 2);
	EgyptText->setPosX(EgyptImage->getPosX());

	// 将两个精灵添加到 panel 节点
	g_Panel->addChild(EgyptImage);
	g_Panel->addChild(EgyptText);
}

3.加载按钮

void InitButton()
{
	// 创建开始按钮
	auto startBtn = gcnew Button;
	startBtn->setScale(1.5f, 1.5f);

	// 设置按钮图片
	startBtn->setNormal(gcnew Sprite(L"res/LS07.png"));

	// 设置按钮被选中时的图片
	startBtn->setSelected(gcnew Sprite(L"res/LS08.png"));

	// 设置按钮禁用时的图片
	startBtn->setDisabled(gcnew Sprite(L"res/LS09.png"));

	// 设置按钮位置
	startBtn->setPos(Window::getWidth() / 2, Window::getHeight() - 120);

	// 添加开始按钮
	g_Scene->addChild(startBtn);

	// 创建左选按钮
	g_LeftButton = gcnew Button;
	g_LeftButton->setScale(1.5f, 1.5f);
	g_LeftButton->setNormal(gcnew Sprite(L"res/LS01.png"));
	g_LeftButton->setSelected(gcnew Sprite(L"res/LS02.png"));
	g_LeftButton->setDisabled(gcnew Sprite(L"res/LS03.png"));
	g_LeftButton->setPosX(g_LeftButton->getWidth() / 2);
	g_LeftButton->setPosY((Window::getHeight() - g_LeftButton->getHeight()) / 2);
	g_LeftButton->setEnable(false);
	g_Scene->addChild(g_LeftButton);

	// 点击左按钮执行 ClickLeft 函数
	g_LeftButton->setClickFunc(ClickLeft);

	// 创建右选按钮
	g_RightButton = gcnew Button();
	g_RightButton->setScale(1.5f, 1.5f);
	g_RightButton->setNormal(gcnew Sprite(L"res/LS04.png"));
	g_RightButton->setSelected(gcnew Sprite(L"res/LS05.png"));
	g_RightButton->setDisabled(gcnew Sprite(L"res/LS06.png"));
	g_RightButton->setPosX(Window::getWidth() - g_RightButton->getWidth() / 2);
	g_RightButton->setPosY((Window::getHeight() - g_RightButton->getHeight()) / 2);
	g_Scene->addChild(g_RightButton);

	// 点击右按钮执行 ClickRight 函数
	g_RightButton->setClickFunc(ClickRight);
}

4.移动关卡面板

void MovePanel()
{
	// 创建目标点
	auto point = Point(-Window::getWidth() * g_Level, 0);

	// 创建移动动画
	auto action = gcnew MoveTo(0.5f, point);

	// 停止 panel 的所有动画
	g_Panel->stopAllActions();

	// 执行新动画
	g_Panel->runAction(action);
}

5.点击按钮

左LEFT

void ClickLeft()
{
	// level 为 1 时,禁用左选按钮
	if (g_Level == 1)
	{
		g_LeftButton->setEnable(false);
	}

	// 按下左选按钮后,把右选按钮启动
	g_RightButton->setEnable(true);
	
	// level 减一
	g_Level--;
	
	// 移动 panel
	MovePanel();
}

右RIGHT

void ClickRight()
{
	// level 为 1 时,禁用右选按钮
	if (g_Level == 1)
	{
		g_RightButton->setEnable(false);
	}

	// 按下右选按钮后,把左选按钮启动
	g_LeftButton->setEnable(true);

	// level 加一
	g_Level++;

	// 移动 panel
	MovePanel();
}

五.效果图片


六.总结

本节课主要是讲解了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 - Rails 3 的 RGB 颜色选择器 - 2

    状态:我正在构建一个应用程序,其中需要一个可供用户选择颜色的字段,该字段将包含RGB颜色代码字符串。我已经测试了一个看起来很漂亮但效果不佳的。它是“挑剔的颜色”,并托管在此存储库中:https://github.com/Astorsoft/picky-color.在这里我打开一个关于它的一些问题的问题。问题:请建议我在Rails3应用程序中使用一些颜色选择器。 最佳答案 也许页面上的列表jQueryUIDevelopment:ColorPicker为您提供开箱即用的产品。原因是jQuery现在包含在Rails3应用程序中,因此使用基

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

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

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

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

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

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

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

  7. 「Python|Selenium|场景案例」如何定位iframe中的元素? - 2

    本文主要介绍在使用Selenium进行自动化测试或者任务时,对于使用了iframe的页面,如何定位iframe中的元素文章目录场景描述解决方案具体代码场景描述当我们在使用Selenium进行自动化测试的时候,可能会遇到一些界面或者窗体是使用HTML的iframe标签进行承载的。对于iframe中的标签,如果直接查找是无法找到的,会抛出没有找到元素的异常。比如近在咫尺的例子就是,CSDN的登录窗体就是使用的iframe,大家可以尝试通过F12开发者模式查看到的tag_name,class_name,id或者xpath来定位中的页面元素,会抛出NoSuchElementException异常。解决

  8. 微信小程序开发入门与实战(Behaviors使用) - 2

    @作者:SYFStrive @博客首页:HomePage📜:微信小程序📌:个人社区(欢迎大佬们加入)👉:社区链接🔗📌:觉得文章不错可以点点关注👉:专栏连接🔗💃:感谢支持,学累了可以先看小段由小胖给大家带来的街舞👉微信小程序(🔥)目录自定义组件-behaviors    1、什么是behaviors    2、behaviors的工作方式    3、创建behavior    4、导入并使用behavior    5、behavior中所有可用的节点    6、同名字段的覆盖和组合规则总结最后自定义组件-behaviors    1、什么是behaviorsbehaviors是小程序中,用于实现

  9. ruby - 我正在学习编程并选择了 Ruby。我应该升级到 Ruby 1.9 吗? - 2

    我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or

  10. ruby-on-rails - Rails 单选按钮 - 模型中多列的一种选择 - 2

    我希望用户从一个模型的三个选项中选择一个。即我有一个模型视频,可以被评为正面/负面/未知目前我有三列bool值(pos/neg/unknown)。这是处理这种情况的最佳方式吗?为此,表单应该是什么样的?目前我有类似的东西但显然它允许多项选择,而我试图将它限制为只有一个..怎么办? 最佳答案 如果要使用字符串列,让我们说rating。然后在你的表单中:#...#...它只允许一个选择编辑完全相同但使用radio_button_tag: 关于ruby-on-rails-Rails单选按钮-模

随机推荐