博客
关于我
制作横版游戏KillBear第9课:暂停层+屏蔽下层监听
阅读量:475 次
发布时间:2019-03-07

本文共 3675 字,大约阅读时间需要 12 分钟。

在上一节课程中,我们成功实现了添加一个带有冷却效果的技能按钮,教你的英雄增加炫目的大招。如果你计划添加其他技能,依次进行就可以了,不需要额外说明。 本课的目标是讲述如何在游戏层中右上角添加一个按钮,用于实现暂停功能。

开发环境

  • Win64:使用 vs2010
  • Cocos2d-x v3.4 Final
  • TexturePackerGUI
  • MapEdit

实现方法

当游戏暂停时,下方按钮应变为不可触摸状态,以防止出现不可控的BUG,如动画停止、角色无法转动等。为此,我们首先添加一个屏蔽层,再在其上方添加我们的暂停按钮。

代码实现

BarrierLayer 层

  • .h 文件
#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
  • .cpp 文件
#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;}

GamePause 层

  • .h 文件
#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
  • .cpp 文件
#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():恢复当前场景

PopupLayer 弹出层

用于显示弹出的界面及动画效果:

auto popup = PopupLayer::create(targetLayer, type);popup->runAction(getActionWithNum(type));

突出技术要点

  • 添加屏蔽层确保按钮不可触摸
  • 使用按钮事件监听器实现交互逻辑
  • 动画效果实现流畅转换
  • 通信机制确保场景状态管理

通过以上方法,我们可以轻松在游戏中实现暂停功能,同时保持良好的用户体验。

如果感兴趣,可以探索更多场景切换和动画效果的实现细节。

转载地址:http://iredz.baihongyu.com/

你可能感兴趣的文章
中级软考 计算机指令执行过程(取指、分析、执行)计算机重叠流水线问题
查看>>
opencv cv::BorderTypes 像素外推方法(Pixel extrapolation method)
查看>>
摄像头捕获视频流软件AMCAP使用教程(视频采集捕获处理媒体制作微型软件)
查看>>
pytorch torch.item()(返回此张量的值作为标准Python数字。 这仅适用于具有一个元素的张量。)
查看>>
python 如何计算平方、次方?平方根、方根?(math.pow()、math.sqrt())
查看>>
Docker镜像加速
查看>>
x射线和γ射线区别?α射线、β射线
查看>>
python 虚拟环境 virtualenv virtualenvwrapper的使用方法、命令
查看>>
jinja2 {{}} href 双大括号
查看>>
ubuntu无法安装vscode(visual studio code)如何卸载snap?
查看>>
VMware虚拟机:桥接、NAT、Host-only(仅主机)上网方式的区别
查看>>
python numpy.arange() 函数的使用方法 (在给定间隔内返回均匀间隔的值)
查看>>
Unity3D的InputField输入框控件按下Tab键光标自动切换
查看>>
C#实现对象为Json嵌套数组文件的创建
查看>>
静态数组类的封装(泛型)
查看>>
网络穿透/网络映射/远程运维EasyNTS智能云组网如何通过23端口穿透实现远程控制功能?
查看>>
【BUG修复】网络映射/端口穿透/视频组网服务EasyNTS上云网关代理前端数据无法解析问题
查看>>
CHIP-seq流程学习笔记(4)-call peak 软件macs2
查看>>
操作记录-2021-03-15: sunxiaoyu_project
查看>>
Android DEX加固方案与原理
查看>>