这里是 Evankaka 的博客,欢迎大家前来讨论与交流~~~~~~

     转载请注明出处http://blog.csdn.net/evankaka/article/details/42936117

本文要实现游戏中的暂停、重新开始。将当前界面截图,然后用这张图去构造一个层(以这张图为背景),然后加个按钮,主界面点暂停时,pushScene(),然后转到游戏暂停界面,当在游戏暂停界面点继续游戏popScne()。在cocos2dx中推进(pushScene())暂停场景,之前运行的场景将会自动暂停,然后我们可以在暂停场景中操作,当我们不再需要暂停场景时,可以popScene()将暂停场景弹出。重新开始游戏直接replaceScene().

cocos2d-x版本:2.2.5

工程环境:windows7+VS2010

打开方式:将工程放在cocos2d-x安装目录下的project文件夹下用VS打开

(源码免费下载)

本文效果:

一、游戏暂停界面初步实现

思路:将当前界面截图,然后用这张图去构造一个层(以这张图为背景),然后加个按钮,主界面点暂停时,pushScene(),然后转到游戏暂停界面,当在游戏暂停界面点继续游戏时popScne(),

首先看看自定义的游戏暂停的层

头文件 Gamepause.h

#ifndef __Gamepause__H__
#define __Gamepause__H__
#include "cocos2d.h"
USING_NS_CC;
class Gamepause : public cocos2d::CCLayer
{
public:virtual bool init();  static cocos2d::CCScene* scene(CCRenderTexture* sqr);CREATE_FUNC(Gamepause);//继续游戏void menuContinueCallback(CCObject* pSender);private:};#endif // __Gamepause_H__

然后是实现文件

#include "Gamepause.h"
//传入一个CCrenderTexture
//相当于一个正在运行的游戏的截图作为这个暂停对话框的背景
//这样就看起来像是对话框在游戏界面之上,一般游戏当中都是这样子写的。
CCScene* Gamepause::scene(CCRenderTexture* sqr)
{CCScene *scene = CCScene::create();Gamepause *layer = Gamepause::create();scene->addChild(layer,1);//增加部分:使用Game界面中截图的sqr纹理图片创建Sprite//并将Sprite添加到GamePause场景层中//得到窗口的大小CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();CCSprite *back_spr = CCSprite::createWithTexture(sqr->getSprite()->getTexture());  back_spr->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); //放置位置,这个相对于中心位置。back_spr->setFlipY(true);            //翻转,因为UI坐标和OpenGL坐标不同back_spr->setColor(cocos2d::ccGRAY); //图片颜色变灰色scene->addChild(back_spr);return scene;
}bool Gamepause::init()
{if ( !CCLayer::init() ){return false;}//得到窗口的大小CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();//原点坐标CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();//继续游戏按钮CCMenuItemImage *pContinueItem = CCMenuItemImage::create("pause_continue.png","pause_continue.png",this,menu_selector(Gamepause::menuContinueCallback));pContinueItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2+30));CCMenu* pMenu = CCMenu::create(pContinueItem,NULL);pMenu->setPosition(CCPointZero);this->addChild(pMenu, 2);return true;
}
void Gamepause::menuContinueCallback(CCObject* pSender)
{CCDirector::sharedDirector()->popScene();}

使用方法

在游戏主界面init函数加个:

 CCMenuItemImage *pCloseItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png",this,menu_selector(HelloWorld::menuPauseCallback));pCloseItem->setPosition(ccp(visibleSize.width - pCloseItem->getContentSize().width/2 ,visibleSize.height - pCloseItem->getContentSize().height/2));// create menu, it's an autorelease objectCCMenu* pMenu = CCMenu::create(pCloseItem, NULL);pMenu->setPosition(CCPointZero);this->addChild(pMenu, 1);

然后是回调用的函数 暂停界面((记得加上面的头文件就是了))

void HelloWorld::menuPauseCallback(CCObject* pSender)
{//得到窗口的大小CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();CCRenderTexture *renderTexture = CCRenderTexture::create(visibleSize.width,visibleSize.height);//遍历当前类的所有子节点信息,画入renderTexture中。//这里类似截图。renderTexture->begin(); this->getParent()->visit();renderTexture->end();//将游戏界面暂停,压入场景堆栈。并切换到GamePause界面CCDirector::sharedDirector()->pushScene(Gamepause::scene(renderTexture));
}

这里来看看效果:

效果就是这样了,基本实现了游戏暂停的功能了。上面的代码可以直接拿去用,自己把图片改改就行了

二、游戏暂停界面美化实现

单单只有上面的肯定是不行的,太难看了,所以给图片的按钮加个背景图片,然后再加三个按钮,

这是按钮背景图片

这是三个按钮的图片

        

要用的直接拿去用,全是我原创的

直接看下代码,就是在上面的基础上来增加函数的

Gamepause.h

#ifndef __Gamepause__H__
#define __Gamepause__H__
#include "cocos2d.h"
USING_NS_CC;
class Gamepause : public cocos2d::CCLayer
{
public:virtual bool init();  static cocos2d::CCScene* scene(CCRenderTexture* sqr);CREATE_FUNC(Gamepause);//继续游戏void menuContinueCallback(CCObject* pSender);//重新开始游戏void menuRestart(CCObject* pSender);//回主界面void menuLogin(CCObject* pSender);
private:};#endif // __Gamepause_H__

Gamepause.cpp

#include "Gamepause.h"
#include "HelloWorldScene.h"//重新开始游戏的头文件
//传入一个CCrenderTexture
//相当于一个正在运行的游戏的截图作为这个暂停对话框的背景
//这样就看起来像是对话框在游戏界面之上,一般游戏当中都是这样子写的。
CCScene* Gamepause::scene(CCRenderTexture* sqr)
{CCScene *scene = CCScene::create();Gamepause *layer = Gamepause::create();scene->addChild(layer,1);//把游戏层放上面,我们还要在这上面放按钮//增加部分:使用Game界面中截图的sqr纹理图片创建Sprite//并将Sprite添加到GamePause场景层中//得到窗口的大小CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();CCSprite *back_spr = CCSprite::createWithTexture(sqr->getSprite()->getTexture());  back_spr->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); //放置位置,这个相对于中心位置。back_spr->setFlipY(true);            //翻转,因为UI坐标和OpenGL坐标不同back_spr->setColor(cocos2d::ccGRAY); //图片颜色变灰色scene->addChild(back_spr);//添加游戏暂停背景小图,用来放按钮CCSprite *back_small_spr = CCSprite::create("back_pause.png");back_small_spr->setPosition(ccp(visibleSize.width/2,visibleSize.height/2)); //放置位置,这个相对于中心位置。scene->addChild(back_small_spr);return scene;
}bool Gamepause::init()
{if ( !CCLayer::init() ){return false;}//得到窗口的大小CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();//原点坐标CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();//继续游戏按钮CCMenuItemImage *pContinueItem = CCMenuItemImage::create("pause_continue.png","pause_continue.png",this,menu_selector(Gamepause::menuContinueCallback));pContinueItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2+30));//重新开始游戏按钮CCMenuItemImage *pRestartItem = CCMenuItemImage::create("pause_restart.png","pause_restart.png",this,menu_selector(Gamepause::menuRestart));pRestartItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2-20));//回主界面CCMenuItemImage *pLoginItem = CCMenuItemImage::create("pause_login.png","pause_login.png",this,menu_selector(Gamepause::menuLogin));pLoginItem->setPosition(ccp( visibleSize.width/2 ,visibleSize.height/2-70));// create menu, it's an autorelease objectCCMenu* pMenu = CCMenu::create(pContinueItem,pRestartItem,pLoginItem,NULL);pMenu->setPosition(CCPointZero);this->addChild(pMenu, 2);return true;
}
void Gamepause::menuContinueCallback(CCObject* pSender)
{CCDirector::sharedDirector()->popScene();}
//重新开始游戏
void  Gamepause::menuRestart(CCObject* pSender)
{CCDirector::sharedDirector()->replaceScene(HelloWorld::scene());
}
//回主界面
void  Gamepause::menuLogin(CCObject* pSender)
{}

最后再来看看效果:

三、思路总结

游戏暂停将当前界面截图,然后这个张图去创建一个层,然后就是push场景和pop场景了。

Cocos2d-x游戏暂停、继续游戏、重新开始界面的实现---之游戏开发《赵云要格斗》(10)相关推荐

  1. java游戏暂停_小白写了个java的小游戏 想加个暂停的功能 无从下手 求大佬们帮...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 第一次写java的小游戏 想实现点击右下角的暂停 实现游戏的暂停和继续 不知道该怎么加,自己找了线程的内容但试了还是成功不了,求大佬们帮一下小白.代码有点 ...

  2. 十二 手游开发神器 cocos2d-x editor 之游戏暂停悬浮层

    进入游戏主场景,游戏需要临时暂停.重新选关.重新玩等等,所以玩家点击暂停按钮,弹出一个选择悬浮层,这一节我们来实现: 效果如下: 点击右上角游戏暂停: 返回回到开始界面: 代码下载:http://ww ...

  3. Unity关于Time.timeScale游戏暂停

    游戏暂停一般我会使用Time.timeScale = 0,我把游戏暂停理解为和切后台操作是一个意思,都应该停止当前游戏行为.但是这并不表明update和fixUpdate就不运行了. Time.tim ...

  4. Time之游戏暂停功能

    Time.timeScale还会影响Time.time的时间,比如Time.timeScale = 2的话,那么Time.time的增长速度也会变成2倍速度.如果你想取到游戏的实际时间,那么使用Tim ...

  5. unity3d游戏暂停

    timeScale不会影响Update和LateUpdate的执行速度. timeScale只会影响FixedUpdate的速度,因为FixedUpdate是根据时间来的 无论Time.timeSca ...

  6. 【cocos2d-x入门实战】微信飞机大战之十一:游戏暂停和触摸屏蔽

    原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/11999229 一个游戏打到一半尿点咋整?难道要憋着...这不科学啊! 好吧, ...

  7. Unity游戏暂停之Update与FixedUpdate区别

    游戏暂停 示例程序 下面这段代码演示游戏暂停 using UnityEngine; using System.Collections;public class GamePauseTest : Mono ...

  8. python暂停和恢复游戏_pygame游戏之旅 添加游戏暂停功能

    pygame游戏之旅 添加游戏暂停功能 来源:中文源码网    浏览: 次    日期:2019年11月5日 [下载文档:  pygame游戏之旅 添加游戏暂停功能.txt ] (友情提示:右键点上行 ...

  9. Unity实现按Esc键控制面板出现消失,同时游戏暂停

    需要在项目中创建面板对象,具体脚本的实现过程如下 using System.Collections; using System.Collections.Generic; using UnityEngi ...

最新文章

  1. python上下文管理器with
  2. C语言树形打印二叉树
  3. Cocos2d中使用颜色混合:加算,减算
  4. java实现支付宝支付完整过程(沙箱测试环境,下篇整合ssm)
  5. 如何看待papi酱的个人平台papitube?
  6. 通信 / HTTP Host 请求头的作用
  7. Git、TortoiseGit、GitHub、Gitee、GitLab 安装与入门使用
  8. Passwordless SSH Login
  9. 在企业中使用的Silverlight:RAD数据通信用户友好的数据库访问
  10. C++学习之路 | PTA乙级—— 1045 快速排序 (25 分)(精简)
  11. Babylon-AST初探-代码更新删除(Update Remove)
  12. 346个基因组可视化工具一网打进!
  13. 汇编学习的安装DOSBOX及debug.exe教程
  14. 计算机视觉算法岗面经,2019秋招资料
  15. Bailian2855 计算概论(刘志敏老师班)ACM测试题1【椭圆】
  16. js高级学习笔记(b站尚硅谷)-13-作用域链
  17. 【VMware vSAN 7.0】5.4.2 创建 vSAN 集群—我们有软硬件解决方案
  18. 【机器学习】机器学习数据集大全
  19. 全球一月内两次遭到病毒暴击 2017网络安全生态峰会或有解药
  20. Linux查看设备端口号

热门文章

  1. mdadm彻底删除software RAID
  2. HTTP请求一张图片,转为流返回
  3. 光敏电阻简单应用——晚上灯亮,白天灯灭
  4. 【OAI】【debug】分立机器基站接入核心网并调试可用解决之路
  5. Linux的常用命令有哪些?
  6. 7.TensorRT中文版开发教程-----TensorRT中的INT8量化详解
  7. ORACLE-使用DBCA创建数据库
  8. PCM开发板模块实验指导--有刷直流马达速度控制实验
  9. 《实验细节》MELD文本预处理
  10. KubernetesDatabase-k8s中helm方式安装postgresql及pgadmin