博客
关于我
制作横版游戏KillBear第9课:暂停层+屏蔽下层监听
阅读量:476 次
发布时间: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/

你可能感兴趣的文章
shell编程===》进程锁
查看>>
Linux小操作LVM
查看>>
Split返回数组元素含有空字符串移除
查看>>
解决VS中C语言运行scanf错误
查看>>
Java注解
查看>>
idea上的程序报错-> 错误: 找不到或无法加载主类
查看>>
java刷题--49字母异位词分组
查看>>
《web安全入门》(四)前端开发基础Javascript
查看>>
laravel中视图模板的表单提交
查看>>
在Ubuntu上检查一个软件包是否安装命令
查看>>
mysql的group by ,order by语句的使用
查看>>
call_user_func函数和call_user_func_array函数
查看>>
配置php.ini文件,关闭错误提示,打开错误日志,设置错误日志路径
查看>>
接收get或post数据使用fwrite写入文件中,方便追踪错误;或其他几种缓存方式
查看>>
mysql开启慢查询日志及查询
查看>>
Window平台Grpc框架搭建
查看>>
C中几道位运算的例题
查看>>
python入门(二)基础知识
查看>>
golang log4go 使用说明及丢失日志原因
查看>>
fatal error all goroutines are asleep - deadlock!
查看>>