在上一节课程里,我们实现了添加一个有冷却效果的技能按钮,教你的英雄增加炫目的大招,如果你还打算有其他技能的话,依次添加就可以了,就不再多说。本课讲述在游戏层中右上角添加一个按钮,用于暂停游戏功能的实现。

开发环境

Win64 : vs2010

Cocos2d-x v3.4Final

TexturePackerGUI

MapEdit

开始之前先说明下实现方法:

当游戏暂停的时候,下方按键应该是无法触摸的。不然会出现不可控的各种BUG,比如动画不动了,角色还可以转向之类的奇葩。

所以先添加一个屏蔽层,然后在上方添加我们的按钮。

代码

other

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

这个.h没啥好说的。

.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->addEventListenerWithSceneGraphPriority(listener,this);

}

首先创建了一个半透明的层,然后添加一个监听,只要在添加时候设置好ZOerder,就可以实实现我们需要的屏蔽监听功能。

这是我认为最好理解和最好实现的方法,其实也可以通过改变原先层的按钮监听顺序来。但是太麻烦了。

最笨的暴力破解也是万能破解方法。

然后创建我们所需要的真正的暂停层。

GamePause

.h

和上面的基本相同,单纯的创建一个层。所以不需要在分析一遍了吧?

.cpp

#include "GamePause.h"

#include "GameScene.h"

#include "BarrierLayer.h"

#include "GameStartScene.h"

GamePause::GamePause()

{

}

GamePause::~GamePause()

{

}

bool GamePause::init()

{

if(!Layer::init())

return false;

//下面是我们的按钮

Size WinSize = Director::getInstance()->getWinSize();

Vec2 CenterPoint = Vec2(WinSize.width/2,WinSize.height/2);

auto continuebutton = Button::create("buttonclick.png");

continuebutton->setTitleText("Continue");

continuebutton->addTouchEventListener([=](Ref * pSender , Widget::TouchEventType type){

switch (type)

{

case cocos2d::ui::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 cocos2d::ui::Widget::TouchEventType::ENDED:

{

//之前就停止了所有的scene,不回复下就算创建新场景也是pause的

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 cocos2d::ui::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;

}

cpp里面需要注意的是:我使用了Cocos Studio的UI控件,比原来的创建一个menu要快,而且Button用的是9Sprite,自带拉伸变化动画,而且保证图像不失真 (其实用到是为了偷懒,少写很多代码), 代码include需要注意下,我把下一篇要将的也给弄进去了,自行删改下。

下面这种也是按键监听方法,只是把回调函数直接写在后面了

continuebutton->addTouchEventListener([=](Ref * pSender , Widget::TouchEventType type){

switch (type)

{

case cocos2d::ui::Widget::TouchEventType::ENDED:

{

getParent()->removeFromParent();

Director::getInstance()->resume();

}

break;

}

});

需要注意的是这里我通过调用parent的removeFromParent.那是需要结合下面的来用的。

单独使用直接removeFromParent就好了,千万注意不然整个游戏就没了。

在此需要用到的几个方法是:

Director::getInstance()->pause()//暂停场景

Director::getInstance()->replaceScene()//创建新场景代替原来的

Director::getInstance()->resume();//恢复场景

如果没有resume…..感兴趣的可以试试是什么状况。

PopupLayer

这是个弹出层。

在这里可以写一些动画效果,展现某一个层弹出。

由于上面用的是Layer而不是Scene实现的暂停回调(为啥其他教程喜欢压栈一个Scene?重新载入不慢?) 。

所以我们可以根据自己的需求写弹出动画。

.h

#ifndef _POPUP_LAYER_H_

#define _POPUP_LAYER_H_

#include "cocos2d.h"

#include "BarrierLayer.h"

USING_NS_CC;

class PopupLayer : public Layer

{

public:

PopupLayer();

~PopupLayer();

bool init(Layer * targetLayer,int type);

static PopupLayer* create(Layer * targetLayer,const int type);

static PopupLayer* create(Layer * targetLayer)

{return PopupLayer::create(targetLayer,0);};

Action * getActionWithNum(int num);

};

#endif

需要往里输入弹出的对象层,所以不能用CREATE_FUNC这个宏了.

.cpp

#include "PopupLayer.h"

PopupLayer::PopupLayer()

{

}

PopupLayer::~PopupLayer()

{

}

PopupLayer* PopupLayer::create(Layer * targetLayer,const int type)

{

PopupLayer* popupLayer = new PopupLayer();

if (popupLayer && popupLayer->init(targetLayer,type))

{

popupLayer->autorelease();

return popupLayer;

}

else

{

CC_SAFE_DELETE(popupLayer);

return nullptr;

}

}

bool PopupLayer::init(Layer * targetLayer,const int type)

{

if(!Layer::init())

return false;

addChild(BarrierLayer::create(),0);

targetLayer->setTag(1);

addChild(targetLayer,1);

auto popup = getChildByTag(1);

//popup->setScale(0.9f);

popup->runAction(getActionWithNum(type));

return true;

}

//下面是回调的动画,自己通过序号创建,反正只写了几个从窗口外移入和一个抖动动画

//默认是抖动动画,也就是0

Action * PopupLayer::getActionWithNum(int num)

{

Size WinSize = Director::getInstance()->getWinSize();

switch (num)

{

case 1:

{

auto act1 = MoveTo::create(0.0f,Vec2(0,WinSize.height));

auto act2 = MoveTo::create(0.5f,Vec2::ZERO);

return Sequence::createWithTwoActions(act1,act2);

}

case 2:

{

auto act1 = MoveTo::create(0.0f,Vec2(WinSize.width,0));

auto act2 = MoveTo::create(0.5f,Vec2::ZERO);

return Sequence::createWithTwoActions(act1,act2);

}

case 3:

{

auto act1 = MoveTo::create(0.0f,Vec2(0,-WinSize.height));

auto act2 = MoveTo::create(0.5f,Vec2::ZERO);

return Sequence::createWithTwoActions(act1,act2);

}

case 4:

{

auto act1 = MoveTo::create(0.0f,Vec2(WinSize.width,0));

auto act2 = MoveTo::create(0.5f,Vec2::ZERO);

return Sequence::createWithTwoActions(act1,act2);

}

default:

{

auto scaleTo = ScaleTo::create(0.15f, 1.25f);

auto scaleTo2 = ScaleTo::create(0.1f, 0.8f);

return Sequence::createWithTwoActions(scaleTo,scaleTo2);

}

}

}

在init中,

加入先一个屏蔽层

加入需要弹出的对象层

让对象层运行动画,默认是0,也就是抖动

当然,也可以随你的愿意创建删除时动画。这里就不再说了。

Operter

operterLayer

.cpp

在我们的控制层init放上一个按钮,实现弹出层回调。

不要忘了在上面

#include "ui/CocosGUI.h"

#include "GamePause.h"

using namespace ui;

auto pause = Button::create("pause.png");

pause->setPosition(Vec2(WinSize.width- pause->getContentSize().width/2,WinSize.height-pause->getContentSize().height/2));

pause->addTouchEventListener([=](Ref* pSender , Widget::TouchEventType type)

{

switch (type)

{

case cocos2d::ui::Widget::TouchEventType::ENDED:

{

addChild(PopupLayer::create(GamePause::create()));

Director::getInstance()->pause();

}

break;

}

});

addChild(pause);

效果

结语

本篇效果就是添加了一按钮,实现游戏的暂停和重新开始,额外内容是添加了一个防止触摸穿透的屏蔽层和弹出动画。

下一篇,创建游戏开始画面,毕竟不可能刚打开这游戏就直接在运行了吧?

制作横版游戏KillBear第9课:暂停层+屏蔽下层监听相关推荐

  1. Cocos2D来制作横版过关游戏1

    本文实践自 Allen Tan 的文章< How To Make A Side-Scrolling Beat 'Em Up Game Like Scott Pilgrim with Cocos2 ...

  2. unity3d横版游戏移动_制作游戏并不困难。 回顾Unity3D上的小型移动项目

    unity3d横版游戏移动 Clearly, I'm telling about my experience and my vision, but many things would be commo ...

  3. 基于unity的2D横版游戏开发日志 小结

    前言 说是基于unity的2D横版游戏,实际上只是一个初学unity与C#新人的练手Demo,目前还处于半成状态.美术资源方面全部出自unity免费资源,经过自己的小修,大致拼出了一个游戏.代码方面, ...

  4. Cocos2d-x简单横版游戏

    简单横版游戏 作业要求 实现效果 具体实现 HelloWorldScene.cpp HelloWorldScene.h 视频演示以及资源 简单横版游戏 作业要求 左边wasd4个虚拟按键能控制角色移动 ...

  5. Creator2D横版游戏(2)背景图随主角移动 | 单独相机拍UI

    Creator2D横版游戏(2)背景图随主角移动 上次教程做好了人物左右走,这次来做背景移动 本次目标 1.背景图跟随角色移动 2.限制背景图移动范围,不出黑边 移动背景的脚本放在canvas上 说是 ...

  6. unity发布WebGl在手机上的横屏适配,webgl横版游戏在手机上直接转横屏

    unity版本2020.1 问题:webgl的横版游戏 1920*1080,在手机上适配的不好,还是竖屏显示, 使用官方的说明,说是只在全屏模式下能旋转,也不好用,可能直接旋转也不会达到理想的效果 解 ...

  7. 小狐狸横版游戏开发学习笔记(上)

    小狐狸横版游戏开发学习笔记(上) 目录 小狐狸横版游戏开发学习笔记(上) 1.关于如何创建Tilemap 2.关于地图格子之间出现间隙的问题 3.如何设置自己想要的控制按键 4.如何解决玩家移动过程中 ...

  8. Creator2D横版游戏(1)主角左右走

    Creator2D横版游戏(1)主角左右走 本次目标 源码在文末 需要两个按钮,一张背景图和一套主角spine 节点层级 主角太大,给它缩小点 创建一个新脚本挂到主角上 先写一个枚举出来,只有左右走和 ...

  9. unity2D横版游戏教程终章-主菜单和暂停菜单

    最后一节我们做一下主菜单和暂停菜单 我们创建一个新的scene,命名为Menu,这个就是主菜单场景 我们双击Menu进去设置一下我们的UI 我们先添加一下Canvas,在Canvas下面创建连个Pan ...

最新文章

  1. 从Asp.net转到Php之调试
  2. 【OSS 排查方案-5】透过现象看本质之网络排查分析
  3. opengl加载显示3D模型STL类型文件
  4. Linux学习笔记之一
  5. nodejs error Windows_NT 6.1.7601 21 error code ELIFECYCLE 22 error angular-adminlte-plugin@0.1.0
  6. Linux Shell——函数的使用
  7. 【opencv学习】【形态学】【腐蚀与膨胀】【开运算与闭运算】【礼帽和黑帽】
  8. 添加底部小火箭+目录
  9. 当下,所有工程师都要具备技术变现思考和能力【赢在CSDN】
  10. HPUX分析Crash Dump_q4pxdb vmunix
  11. aop java intercept_关于 Spring3 报org.aopalliance.intercept.MethodInterceptor问题解决方法
  12. 如何在linux运行exe文件,在Deepin系统下直接运行exe文件的方法
  13. 天线分类特征学习笔记(1)偶极子天线
  14. java小球碰撞界面设计_JavaScript实现小球碰撞特效
  15. Flash遮罩之光芒四射、佛光普照
  16. 【转】书上的字快速弄到电脑上
  17. html页面会出现浏览器崩溃,电脑出现页面崩溃怎么解决
  18. java按秒查询数据_ClickHouse留存分析工具十亿数据秒级查询方案
  19. 学习java可以做什么?学习java有什么用?
  20. C语言实验——求两个整数之和 (sdut oj)

热门文章

  1. 圣斗士星矢服务器维护时间,7月2日服务器维护更新公告
  2. 中州韵输入法(rime)导入搜狗词库
  3. rime (中州韵) 安装方法
  4. vue表单校验之bluer,change
  5. 清华山维EPS二次开发-距离平行线
  6. 批量下载论文代码(对一篇论文的所有参考文献进行自动下载或者)
  7. Webpack,凉了
  8. [terry笔记]Oracle SQL 优化之sql tuning advisor (STA)
  9. iOS 获取手机倾斜角度
  10. SVN服务端和客户端的说明与操作