Cocos2dx游戏教程(十三):“见缝插针”,更新函数Update

在前两个教程中是不是都出现了update方法呢?那么这个方法的左右时什么呢?本节将会给大家介绍下cocos2dx update方法以及定时器的运用。

相信大家在一看是创建空工程的时候应该就已经接触到了吧,运行工程后在屏幕的左下角有一个不停变换的数字,就在实时刷新哦,有一个方法

pDirector->setDisplayStats(true);
pDirector->setAnimationInterval(1.0 / 60.0f);

设置刷新频率哦。

那么我们就来介绍下更新函数的种类:

一、scheduleUpdate()

scheduleUpdate()方法,默认执行的目标为update(float dt),默认无限循环,默认每一帧执行一次,默认无等待时间。

我们可以看一下主场景uodate的实现

//刷新游戏
void GameScene::update(float dt) {
	//刷新玩家小球位置
	auto max = userBallList.size() >= 4 ? 4 : userBallList.size();
	for (unsigned int i = 0; i < max; i++) {
		auto ball = userBallList.at(i);
		if (!ball) {
			continue;
		}
		ball->setPosition(360, 300 - 42 * i);
		ball->setVisible(true);
	}
	//检测是否碰撞,如果碰撞,游戏结束
	if (isBallCollision) {
		//播放音效
		GameMusic::playEffect("music/fail.wav");
		circle->stopAction(rotate);
		this->runAction(Sequence::create(
			DelayTime::create(0.8f),
			CallFunc::create(CC_CALLBACK_0(GameScene::createFailedLayer, this)),
			NULL));
		unscheduleUpdate();
	}

	if (!isBallCollision) {
		if (userBallNum == 0) {
			//播放音效
			GameMusic::playEffect("music/win.wav");
			this->runAction(Sequence::create(
				DelayTime::create(0.5f),
				CallFunc::create(CC_CALLBACK_0(GameScene::createSuccessLayer, this)),
				NULL));
			unscheduleUpdate();
		}
	}
}

使用方式在init中调用,那么update方法则每一帧执行一次哦,我们可以看到上面的方法中进行了胜利失败检测,当检测到胜利失败,显示胜利失败界面,当然已经显示胜利失败了,需要终止当前的定时器,那就使用它的一个对应方法unscheduleUpdate()来终止更新

this->scheduleUpdate();

二、schedule()

上面scheduleUpdate()方法每一帧执行一次,那么如果我们有其他的需求,但是不需要每一帧执行一次怎么办呢?

cocos2dx很贴心的给大家提供了schedule()的方式
使用方式和scheduleUpdate()相似啊,不过需要指定更新的目标咯

我们看一下使用方式

首先我们定义一个方法

void HelloWorld::test_schedule(float dt)
{
    CCLOG("test schedule()");
}

然后通过schedule调用该方法

//每隔1.0f执行一次,不加时间默认每帧都执行哦
schedule(schedule_selector(HelloWorld::test_schedule), 1.0f);

同理也有对应的终止方法

unschedule(schedule_selector(HelloWorld::test_schedule));

三、scheduleOnce();

当然还有一些情况,我们需要且仅需要执行一次,这种方法当然可以使用Action的组合动作触发,那么有这样定时器么?

答案时肯定有的啊,cocos2dx同样给我们提供了一个方便的方法,那就是scheduleOnce(),执行且只执行一次。、

我们还是看上面的test_schedule方法,scheduleOnce的使用方式和schedule一样哦

this->scheduleOnce(schedule_selector(HelloWorld::test_schedule), 1.0f)

注意:不是每隔1.0f执行一次啦,这儿是1.0秒之后执行1次哦。

当有一些数据需要延迟处理的时候该定时器就实现它的作用啦。
定时器的作用很重要哦,大家可以去看一下相关的源码,了解如何实现的。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值