Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器

时间:2022-09-10 19:22:05

保卫萝卜~想法一直存在于想法,实战才是硬道理!有想法就去实现,眼高手低都是空谈。

 
一、游戏主循环GameSchedule
     主循环是游戏处理逻辑,控制游戏进度的地方,处理好主循环是很重要的。写一个简单的游戏主循环是很有必要的~
游戏主循环有开始、有结束、有暂停、有恢复把握好进度,控制好游戏,处理好逻辑。我在Cocos2dx进入主场景时开启游戏主循环,在永远不再使用时删除主循环,在游戏暂停时pause主循环,在游戏恢复时resume主循环。
 
#ifndef __GameSchedule__
#define __GameSchedule__
#include "cocos2d.h" USING_NS_CC;
class GameSchedule : public Ref
{
public:
static GameSchedule* getInstance();
void start();
void end();
static void pause();
static void resume();
private:
virtual void onExit();
~GameSchedule();
void globalUpdate(float time);
void init();
}; #endif
#include "GameSchedule.h"
#include "GameDelayTime.h"
#include "SceneMgr.h"
static GameSchedule* _instance = nullptr;
static bool _pause = true; GameSchedule* GameSchedule::getInstance()
{
if( !_instance )
{
_instance = new GameSchedule();
_instance->init();
}
return _instance;
} void GameSchedule::init()
{
_pause = true;
} void GameSchedule::start()
{
log("GameSchedule -----> start ");
_pause = false;
Director::getInstance()->getScheduler()->schedule(schedule_selector(GameSchedule::globalUpdate),this,,false);
} void GameSchedule::end()
{
log("GameSchedule -----> end ");
Director::getInstance()->getScheduler()->unschedule(schedule_selector(GameSchedule::globalUpdate),this);
CC_SAFE_DELETE(_instance);
} void GameSchedule::pause()
{
log("GameSchedule -----> pause ");
_pause = true;
} void GameSchedule::resume()
{
log("GameSchedule -----> resume ");
_pause = false;
} void GameSchedule::globalUpdate(float time)
{
if( _pause ) return;
GameDelayTime::getInstance()->UpdateTime(time);
SceneMgr::getInstance()->UpdateScene(time);
} void GameSchedule::onExit()
{
log("GameSchedule dispose!!!!1111");
} GameSchedule::~GameSchedule()
{
log("GameSchedule dispose!!!!222");
}

GameSchedule.cpp

 
使用静态单例创建主循环对象,并使用Schedule 注册函数接口,作为引擎的主循环回调。
 
Director::getInstance()->getScheduler()->schedule(schedule_selector(GameSchedule::globalUpdate),this,0,false);
 
这里的GameSchedule::globalUpdate函数将是逻辑处理的开始,定时器刷新,场景处理等。
 
在进入主场景时开启入主循环,实现游戏的逻辑处理。
Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器
 
二、定时器GameDelayTime
 
     定时器也就是定时回调,在有限时间内调用指定目标函数。这在一些游戏逻辑处理中很有用,包括一些动作处理(Cocos2dx中有延时动作和回调动作)。当然,有一个自己写的处理函数,我想是非常棒的~自己动手才能理解。
 
     定时器的处理类GameDelayTime将会集中处理所有的定时器、更新定时器、删除定时器。当然GameDelayTime类将会出现在游戏主循环GameSchedule::globalUpdate函数中,使用游戏主循环控制整个游戏的所有动作表现,当游戏暂停时停止所有逻辑处理,等待再次恢复。定时器数据类DelayTimeDate是定时器的数据中心,记录定时器的延迟时间、延迟目标等。如果达到延迟时间将会调用目标函数,并退出自更新,等待处理类GameDelayTime删除。
     游戏中的定时器是危险的,如果在场景中使用了定时器或在结点对象中使用定时器时,必须在退出场景或移除结点时删除所使用的定时器!
如:Node::onExit()时 删除定时器对象。这是至关重要的!如果结点已移除而没有删除定时器对象,那么定时器指针会一直存在于内存,指针成为野指针,到达延迟时间时被调用将会产生不可预料的麻烦。(我很想知道该怎样去判断一个函数指针指向的目标是否被释放……这样就可以避免野指针调用后崩溃,自己c++太菜……希望有人能告诉我)。
 
#ifndef __GameDelayTime__
#define __GameDelayTime__ #include "cocos2d.h"
using namespace std;
USING_NS_CC; class DelayTimeDate
{
public:
static DelayTimeDate* create( float delayTime,std::function<void()> callback );
CC_SYNTHESIZE( float, delayTime, DelayTime );
CC_SYNTHESIZE( std::function<void()>, callback, Callback );
CC_SYNTHESIZE_READONLY( float, time, TotalTime );
bool update(float time);
private:
float _time;
void init( float delayTime,std::function<void()> callback ){
_time = ;
setDelayTime(delayTime);
setCallback(callback);
}
}; class GameDelayTime
{
public:
static GameDelayTime* getInstance();
DelayTimeDate* addDelayTimeCallBack( float delayTime,std::function<void()> callback );
void removeDelayTimeCallBack( DelayTimeDate* delayTimeDate );
void UpdateTime(float time);
private:
vector<DelayTimeDate*> _keyMap; void init(); }; #endif
#include "GameDelayTime.h"

static GameDelayTime* _instance = nullptr;

GameDelayTime* GameDelayTime::getInstance()
{
if(!_instance)
{
_instance = new GameDelayTime();
_instance->init();
}
return _instance;
} void GameDelayTime::init()
{
} DelayTimeDate* GameDelayTime::addDelayTimeCallBack( float delayTime,std::function<void()> callback )
{
auto delayTimeDate = DelayTimeDate::create(delayTime,callback);
_keyMap.push_back(delayTimeDate);
return delayTimeDate;
} void GameDelayTime::removeDelayTimeCallBack( DelayTimeDate* delayTimeDate )
{
int size = _keyMap.size();
while (size-->)
{
if(delayTimeDate == _keyMap.at(size) )
{
_keyMap.erase(_keyMap.begin()+size);
CC_SAFE_DELETE(delayTimeDate);
break;
}
}
} void GameDelayTime::UpdateTime(float time)
{
int size = _keyMap.size();
while (size-->)
{
auto delayTimeDate = _keyMap.at(size);
if( delayTimeDate != nullptr )
{
bool isCallBack = delayTimeDate->update(time);
if( isCallBack )
{
removeDelayTimeCallBack(delayTimeDate);
}
} }
} DelayTimeDate* DelayTimeDate::create( float delayTime,std::function<void()> callback )
{
DelayTimeDate* delayTimeDate = new DelayTimeDate();
delayTimeDate->init(delayTime,callback);
return delayTimeDate;
} bool DelayTimeDate::update(float time)
{
_time+=time;
if( _time >= getDelayTime() )
{
if( callback )
{
callback();
return true;
}
}
return false;
}

GameDelayTime.cpp

 
三、结合
     游戏主循环与定时器基本就这样了,我的实现比较简单。
Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器
 
简单出兵应用:
 
Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器
 
  简单的控制主循环实现游戏的暂停逻辑处理。目前是比较简单的实现,希望后续能想到更好的idea。

Cocos2d-x 3.2 学习笔记(十六)保卫萝卜 游戏主循环与定时器的更多相关文章

  1. python3&period;4学习笔记&lpar;十六&rpar; windows下面安装easy&lowbar;install和pip教程

    python3.4学习笔记(十六) windows下面安装easy_install和pip教程 easy_install和pip都是用来下载安装Python一个公共资源库PyPI的相关资源包的 首先安 ...

  2. &lpar;C&sol;C&plus;&plus;学习笔记&rpar; 十六&period; 预处理

    十六. 预处理 ● 关键字typeof 作用: 为一个已有的数据类型起一个或多个别名(alias), 从而增加了代码的可读性. typedef known_type_name new_type_nam ...

  3. JavaScript权威设计--CSS&lpar;简要学习笔记十六&rpar;

    1.Document的一些特殊属性 document.lastModified document.URL document.title document.referrer document.domai ...

  4. MySQL学习笔记十六:锁机制

    1.数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制.MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. 2.MySQL使用了三种类型的锁机 ...

  5. python 学习笔记十六 django深入学习一 路由系统,模板,admin,数据库操作

    django 请求流程图 django 路由系统 在django中我们可以通过定义urls,让不同的url路由到不同的处理函数 from . import views urlpatterns = [ ...

  6. SharpGL学习笔记&lpar;十六&rpar; 多重纹理映射

    多重纹理就把多张贴图隔和在一起.比如下面示例中,一个表现砖墙的纹理,配合一个表现聚光灯效果的灰度图,就形成了砖墙被一个聚光灯照亮的效果,这便是所谓的光照贴图技术. 多重纹理只在OpenGL扩展库中才提 ...

  7. yii2源码学习笔记&lpar;十六)

    Module类的最后代码 /** * Registers sub-modules in the current module. * 注册子模块到当前模块 * Each sub-module shoul ...

  8. Swift学习笔记十六:协议

    Protocol(协议)用于统一方法和属性的名称,而不实现不论什么功能. 协议可以被类.枚举.结构体实现.满足协议要求的类,枚举,结构体被称为协议的遵循者. 遵循者须要提供协议指定的成员,如属性,方法 ...

  9. PHP学习笔记十六【方法】

    <?php //给一个函数传递基本数据类型 $a=90; $b=90.8; $c=true; $d="hello world"; function test1($a,$b,$ ...

随机推荐

  1. log4j&period;properties 详解与配置步骤

    一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR 为严重错误 主要是程序的错误WARN 为一般警告,比如session丢失IN ...

  2. sqlserver08评估期已过的解决方法

    打开sqlserver出现提示:评估期已过.有关如何升级的测试版软件的信息,请访问http://www.microsoft.com/sql/howtobuy 解决方法如下: 第一步:进入开始菜单--- ...

  3. &lbrack;摘&rsqb;Hibernate查询事务必要性

    背景: 添加事务与否都不影响Hibernate的查询操作. 问题: 查询操作是否有必要添加事务? 答案1: Hibernate官方手册上建议任何操作(增删改查)都需要添加事务. 答案2: robbin ...

  4. WordPress插件制作教程&lpar;六&rpar;&colon; 插件函数之动作&lpar;Actions&rpar;函数

    这一篇为大家说一下WordPress插件函数吧,要制作插件,了解这些函数是非常有必要的 WordPress插件函数分为“动作”(Actions)和过滤器”(Filters),WordPress 使用这 ...

  5. bigdata&lowbar;一篇文看懂Hadoop

    本文转载:暂未找到原出处,如需署名 请联系 我们很荣幸能够见证Hadoop十年从无到有,再到称王.感动于技术的日新月异时,希望通过这篇内容深入解读Hadoop的昨天.今天和明天,憧憬下一个十年. 本文 ...

  6. 超超超简单的bfs——POJ-1915

    Knight Moves Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 26102   Accepted: 12305 De ...

  7. Java点滴之类与对象

    类的概述 Java是一门纯粹的面向对象(OOP)语言,面向对象程序是由多个对象所组成的,而对象的创建又必须依赖于类,那么什么又是类呢?在现实世界中,我们常常将多个具有相同或相似特征的对象分为一类,并冠 ...

  8. 局域网内yum源搭建

    在一些环境下,服务器不能连接互联网,但是我们又偏偏需要安装一些软件,此时有点麻烦了.通过使用centos镜像文件,搭建yum本地源,局域网内所有服务器都可以连接这一本地源进行软件的下载和安装,下面具体 ...

  9. 如何打开&period;lxe文件

    介绍两款播放器: 第一款:PotPlayer,这款软件快进看学习视频特特别方便. 软件的下载地址:链接:http://potplayer.daum.net/?lang=zh_CN 第二款:屏幕录像专家 ...

  10. jquery&period;cookie&period;js写入的值没有定义

    这个是插件的基本语法,你写的没错,错就错在你肯定是在本地测试的,cookie是基于域名来储存的.意思您要放到测试服务器上或者本地localhost服务器上才会生效.cookie具有不同域名下储存不可共 ...