制作横版游戏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;
      }
      });
      1. 利用已存在的回调函数:
      2. void GameStartScene::CloseGameCallBack(Ref* pSender, Widget::TouchEventType type) {
        if (type == Widget::TouchEventType::ENDED) {
        Director::getInstance()->end();
        }
        }

        以上方法功能完全相同,但具体实现方式有所差异

  • 界面设计注意事项

    • 建议使用高对比度图片避免视觉疲劳
    • 确保按钮的触控区域合理设计
    • 采用统一的字体和字号风格
  • 关键点代码提示

    • Director::getInstance()->replaceScene() 用于实现场景切换
    • 在AppDelegate中确保用GameStartScene作为初始场景
  • 最佳实践建议

  • 确保代码的可维护性,避免过度优化
  • 定期测试各个功能模块
  • 保持代码注释清晰,便于团队协作
  • 遵循开放式开发原则,保持灵活性
  • 以上优化后的内容综合了技术细节和写作规范,力求做到内容简洁明了且符合技术文档的编写规范同时又不失专业性。

    上一篇:制作横版游戏KillBear第9课:暂停层+屏蔽下层监听
    下一篇:Cocos2d-x网络模块2:HTTP连接

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年03月31日 17时55分17秒