本文共 3675 字,大约阅读时间需要 12 分钟。
在上一节课程中,我们成功实现了添加一个带有冷却效果的技能按钮,教你的英雄增加炫目的大招。如果你计划添加其他技能,依次进行就可以了,不需要额外说明。 本课的目标是讲述如何在游戏层中右上角添加一个按钮,用于实现暂停功能。
当游戏暂停时,下方按钮应变为不可触摸状态,以防止出现不可控的BUG,如动画停止、角色无法转动等。为此,我们首先添加一个屏蔽层,再在其上方添加我们的暂停按钮。
#ifndef _BARRIER_LAYER_H_#define _BARRIER_LAYER_H_#include "cocos2d.h"USING_NS_CC;class BarrierLayer : public Layer{public: BarrierLayer(); ~BarrierLayer(); bool init(); CREATE_FUNC(BarrierLayer);};#endif
#include "BarrierLayer.h"BarrierLayer::BarrierLayer(){}BarrierLayer::~BarrierLayer(){}bool BarrierLayer::init(){ if(!Layer::init()) return false; // 添加半透明屏蔽层 LayerColor* backLayerColor = LayerColor::create(Color4B(25, 25, 25, 125)); this->addChild(backLayerColor); // 添加触摸屏蔽 auto callback = [](Touch*, Event*) { return true; }; auto listener = EventListenerTouchOneByOne::create(); listener->onTouchBegan = callback; listener->setSwallowTouches(true); _eventDispatcher->add_event_listener_with_sence_graph_priority(listener, this); return true;}
#ifndef _GAME_PAUSE_H_#define _GAME_PAUSE_H_#include "cocos2d.h"USING_NS_CC;class GamePause : public Layer{public: GamePause(); ~GamePause(); bool init(); CREATE_FUNC(GamePause);};#endif
#include "GamePause.h"#include "BarrierLayer.h"#include "GameScene.h"#include "GameStartScene.h"GamePause::GamePause(){}GamePause::~GamePause(){}bool GamePause::init(){ if(!Layer::init()) return false; // 其他按钮代码... // 添加继续按钮 auto continuebutton = Button::create("buttonclick.png"); continuebutton->setTitleText("Continue"); continuebutton->addTouchEventListener([\=](Ref* pSender, Widget::TouchEventType type) { switch (type) { case Widget::TouchEventType::ENDED: { getParent()->removeFromParent(); Director::getInstance()->resume(); break; } } }); // 添加重启按钮 auto restartbutton = Button::create("buttonclick.png"); restartbutton->setTitleText("Restart"); restartbutton->addTouchEventListener([\=](Ref* pSender, Widget::TouchEventType type) { switch (type) { case Widget::TouchEventType::ENDED: { Director::getInstance()->resume(); Director::getInstance()->replaceScene(TransitionCrossFade::create(0.5f, GameScene::createScene())); break; } } }); // 添加到标题按钮 auto titlebutton = Button::create("buttonclick.png"); titlebutton->setTitleText("ToTitle"); titlebutton->addTouchEventListener([\=](Ref* pSender, Widget::TouchEventType type) { switch (type) { case Widget::TouchEventType::ENDED: { Director::getInstance()->resume(); // Director::getInstance()->replaceScene(GameStartScene::createScene()); break; } } }); continuebutton->setPosition(Vec2(0, 50) + CenterPoint); restartbutton->setPosition(CenterPoint); titlebutton->setPosition(Vec2(0, -50) + CenterPoint); addChild(continuebutton); addChild(restartbutton); addChild(titlebutton); return true;}
通过 Director 调度场景状态:
Director::getInstance()->pause()
:暂停当前场景Director::getInstance()->replaceScene()
:替换场景Director::getInstance()->resume()
:恢复当前场景用于显示弹出的界面及动画效果:
auto popup = PopupLayer::create(targetLayer, type);popup->runAction(getActionWithNum(type));
通过以上方法,我们可以轻松在游戏中实现暂停功能,同时保持良好的用户体验。
如果感兴趣,可以探索更多场景切换和动画效果的实现细节。
转载地址:http://iredz.baihongyu.com/