-
利用场景、层和精灵等游戏元素,我们可以构建游戏的框架,但是此时的游戏仍然是静止不动的。在一切游戏中,游戏的 状态都会随着时间的流逝而改变,同时我们还需要定时进行一些逻辑判断,例如鱼和子弹的碰撞检测。为了解决以上问题, 我们引入了定时器的概念。定时器是以一定时间间隔连续引发游戏事件的工具。很显然,定时器就是使游戏动态变化所需 的工具。Cocos2d-x 为我们提供了两种方式实现定时机制--使用 update 方法以及使用 schedule 方法,下面简要介绍这两种 方式。
-
第一种定时机制是CCNode的刷新事件update方法,该方法在每帧绘制之前都会被触发一次。由于绘图帧率有限,而每次 更新最终会反映到画面上,所以在每帧之间刷新一次已经足够应付大部分游戏逻辑处理的要求了。我们捕鱼的碰撞检测机 制就完全可以通过 update 事件来实现。
- CCNode默认并没有启用update事件,为了启用定时器,我们需要调用scheduleUpdate方法,并重载update以执行自己的 代码。对应地,我们可以使用 unscheduleUpdate 方法停止定时器。
-
- 另一种定时机制是CCNode提供的schedule方法,可以实现以一定的时间间隔连续调用某个函数。由于引擎的调度机制, 这里的时间间隔必须大于两帧的间隔,否则两帧期间的多次调用会被合并成一次调用。所以 schedule 定时器通常用在间隔 较长的定时调用中,一般来说,事件间隔应在 0.1 秒以上。实际开发中,许多定时操作都通过 schedule 定时器实现,例如 鱼群的定时生成、免费金币的定时刷新等。下面我们将以《捕鱼达人》为例来讲解如何使用 schedule 定时器。
- 例子:
- this-]]>schedule(schedule_selector(GameScene::updateGame));
- void GameScene::updateGame(ccTime dt)
- {
- SpriteLayer* sLayer = (SpriteLayer*)this-]]>getChildByTag(sprite_layer_tag);
sLayer-]]>updateFishMovement(dt);
sLayer-]]>checkBulletCollideWithFish();}定时器相关方法
方法
描述
isScheduled(SEL_SCHEDULE selector)
返回一个值,表示selector对应的函 数是否已被添加为定时器
scheduleUpdate
启用update定时器
scheduleUpdateWithPriority(int priority)
启用update定时器,并设定定时器的优先级
unscheduleUpdate
取消update定时器
schedule(SEL_SCHEDULE selector, float interval,unsigned int
repeat, float delay) 添加一个schedule定时器,其中selector 参数为定时器的事件函数,interval参
数为定时器的时间间隔,repeat参数为定 时事件触发一次后还会再次触发 的次数(默认值为kCCRepeatForever,
表示触发无穷多次),delay为第一次触
发事件前的延时。此方法拥有多个重
载,开发者可以选择自己所需的重载函数。 此处时间都以秒为单位 scheduleOnce(SEL_SCHEDULE
selector, float delay)CONTROL 添加一个schedule定时器,但定时器只触发一次
unschedule(SEL_SCHEDULE selector)ESC
取消selector所对应函数的定时器
unscheduleAllSelectors
取消此节点所关联的全部定时器
pauseSchedulerAndActions
暂停此节点所关联的全部定时器与动作
resumeSchedulerAndActions
继续执行此节点所关联的定时器与动作
其他事件除了定时器会不断地提供触发事件外,Cocos2d-x还为我们提供了一些其他与流程控制相关的事件 方法名称
描述
onEnter()
当此节点所在场景即将呈现时,会调用此方法
onEnterTransitionDidFinish()
当此节点所在场景的入场动作结束后,会调用 此方法。如果所在场景没有入场动作,则
此方法会紧接着onEnter()后被调用 onExit()
当此节点所在场景即将退出时,会调用此方法
onExitTransitionDidStart()
当此节点所在场景的出场动作结束后,会调用 此方法。如果所在场景没有出场动作,则此方 法会紧接着onExit()后被调用
这些事件的默认实现通常负责处理定时器和动作的启用与暂停,因此必须在重载方法中调用父类的方法。例如,我们可以 在场景开始时设置游戏的背景音乐:
void GameScene::onEnter()
{
CCScene::onEnter();
this-]]>playBackgroundMusic();}