
制作横版游戏KillBear第10课:开始界面
确保代码的可维护性,避免过度优化 定期测试各个功能模块 保持代码注释清晰,便于团队协作 遵循开放式开发原则,保持灵活性
发布日期:2021-05-10 00:53:59
浏览次数:17
分类:精选文章
本文共 4190 字,大约阅读时间需要 13 分钟。
Cocos2d-x游戏开发者活动之一:创建游戏开始界面
上一篇,我们成功实现了游戏的暂停功能。这次,我们将重点注重创建一个用于选择开始游戏或退出_game的开始界面。
开发工具和环境配置 -| 使用的开发工具:Win64 环节中使用的版本为 vs2010 -| 游戏引擎版本:Cocos2d-x v3.4Final -| 文化工具:TexturePackerGUI,MapEdit -| 简单的界面设计:创建一个适合启动游戏的界面
设计需求分析
- 我们需要创建的界面主要包含以下元素:
- 背景图片:采用已有的图片作为背景,确保场景视觉效果较好
- 按钮:普通按钮用于触发各项功能
- 按钮包括: a. 开始游戏按钮 b. 游戏设置按钮 c. 退出游戏按钮
- 按钮需要与回调Scene关联,确保交互操作可正确处理
代码实现部分 .h文件
#ifndef _GAME_START_SCENE_H_#define _GAME_START_SCENE_H_#include USING_NS_CC#include "LevelChooseLayer.h"#include "GameScene.h"#include "ui/CocosGUI.h"#include "BarrierLayer.h"using namespace ui;class GameStartScene : public Layer {public: static cocos2d::Scene* createScene(); virtual bool init(); void StartGameCallBack(Ref *pSender, Widget::TouchEventType type); void SettingCallBack(Ref *pSender, Widget::TouchEventType type); void CloseGameCallBack(Ref *pSender, Widget::TouchEventType type); CREATE_FUNC(GameStartScene);};#endif
.cpp文件
#include "GameStartScene.h"#include "PopupLayer.h"#include "Transition.h"using namespace cocos2d::ui;Scene* GameStartScene::createScene() { auto scene = Scene::create(); auto layer = GameStartScene::create(); scene->addChild(layer); return scene;}bool GameStartScene::init() { bool ret = false; do { Size visibleSize = Director::getInstance()->getVisibleSize(); // 添加背景 auto blackGround = Sprite::create("blackground.png"); this->addChild(blackGround); blackGround->setPosition(Vec2(visibleSize.width/2, visibleSize.height/2)); // 添加开始按钮 Button* startBtn = Button::create("btn_start.png"); startBtn->setTitleText("Start"); startBtn->setNormalImage("btn_start.png"); startBtn->addTouchEventListener( CC_CALLBACK_2(GameStartScene::StartGameCallBack, this) ); startBtn->setPosition(Vec2(visibleSize.width/2, visibleSize.height*0.75)); this->addChild(startBtn); // 添加设置按钮 Button* settingBtn = Button::create("btn_set.png"); settingBtn->setTitleText("Set"); settingBtn->addTouchEventListener( CC_CALLBACK_2(GameStartScene::SettingCallBack, this) ); settingBtn->setPosition(Vec2(visibleSize.width/2, visibleSize.height*0.5)); this->addChild(settingBtn); // 添加结束按钮 Button* closeBtn = Button::create("btn_end.png"); closeBtn->setTitleText("End"); closeBtn->addTouchEventListener( [=](Ref* pSender, Widget::TouchEventType type) { if (type == Widget::TouchEventType::ENDED) { Director::getInstance()->end(); } } ); closeBtn->setPosition(Vec2(visibleSize.width/2, visibleSize.height*0.25)); this->addChild(closeBtn); ret = true; } while(0); return ret;}void GameStartScene::StartGameCallBack(Ref* pSender, Widget::TouchEventType type) { if (type == Widget::TouchEventType::ENDED) { Director::getInstance()->replaceScene( TransitionCrossFade::create(0.5f, GameScene::createScene()) ); }}void GameStartScene::SettingCallBack(Ref* pSender, Widget::TouchEventType type) { }void GameStartScene::CloseGameCallBack(Ref* pSender, Widget::TouchEventType type) { if (type == Widget::TouchEventType::ENDED) { Director::getInstance()->end(); }}
技术要点和注意事项
关键点回调函数
Director::getInstance()->end()
用于结束整个游戏
关键操作验证
- 2种按钮事件处理方式对比:
- 单独编写新回调函数:
closeBtn->addTouchEventListener([=](Ref* pSender, Widget::TouchEventType type) { switch (type) { case Widget::TouchEventType::ENDED: Director::getInstance()->end(); break; }});
- 利用已存在的回调函数:
void GameStartScene::CloseGameCallBack(Ref* pSender, Widget::TouchEventType type) { if (type == Widget::TouchEventType::ENDED) { Director::getInstance()->end(); }}
以上方法功能完全相同,但具体实现方式有所差异
界面设计注意事项
- 建议使用高对比度图片避免视觉疲劳
- 确保按钮的触控区域合理设计
- 采用统一的字体和字号风格
关键点代码提示
Director::getInstance()->replaceScene()
用于实现场景切换- 在AppDelegate中确保用GameStartScene作为初始场景
最佳实践建议
以上优化后的内容综合了技术细节和写作规范,力求做到内容简洁明了且符合技术文档的编写规范同时又不失专业性。
发表评论
最新留言
不错!
[***.144.177.141]2025年03月31日 17时55分17秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Unsupported SFP+ Module
2019-03-07
linux 中改变运行程序的 stdout
2019-03-07
dpdk 程序创建 kni 虚拟网络接口失败的问题
2019-03-07
uio 设备文件创建以及 iommu 导致 x710 网卡初始化失败问题
2019-03-07
patchelf 的功能以及使用 patchelf 修改 rpath 以解决动态库问题
2019-03-07
关调度与关中断
2019-03-07
rt-thread 使用心得
2019-03-07
c 语言结构体 padding 的问题
2019-03-07
Leetcode第557题---翻转字符串中的单词
2019-03-07
IDEA:修改编辑区背景色
2019-03-07
VS 用户自定义控件未出现在工具箱的解决方案
2019-03-07
正则表达式用法
2019-03-07
IDEA Properties中文unicode转码问题
2019-03-07
CSS 不换行
2019-03-07
VS 单元测试报错处理 Castle.Core
2019-03-07
C# WinForm 圆角button
2019-03-07
.mpp文件在线打开网址
2019-03-07
C#中的委托(delegate)
2019-03-07
webservice调用报错 SAXException
2019-03-07