我试图在暂停一个接一个地从批处理节点中删除一组子节点。因此,如果有三个孩子,那么首先父母将消失immidiatley,然后1秒后第一个孩子将消失,然后又一个1秒(总共2秒)第二个孩子将消失,然后又一个1秒(总共3秒)第三个孩子将消失。
现在我将它们从发动机中移除,如: -
batchNode->removeChild(child1,true);
sleep(1);
batchNode->removeChild(child2,true);
sleep(2)
batchNode->removeChild(child3,true);
但他们都同时从屏幕上消失了!虽然有暂停。是因为它们都是同一批节点的一部分,所以对儿童采取的任何行动都将一次性应用。 ?
请分享您的想法
答案 0 :(得分:1)
即它们在3秒后一起消失?基本上,我认为睡眠实际上阻塞了主线程,所以更新&绘制周期只会在最后一个语句后恢复。
我会通过运行某种CCSequence来执行类似的操作,使用延迟操作和callBlock操作来正确级联。这都是在主线程中执行的,因此在级联期间将刷新显示。
答案 1 :(得分:0)
Sleep()参数通常以毫秒为单位,因此请尝试sleep(1000);在第二和第四行。 另外,也许你最好使用Actions(用CCDelay和CCCallFunc填充的CCSequence)而不是sleep()来阻止你的所有游戏。
答案 2 :(得分:0)
我能够做到,我使用了两种不同的方式: -
<强> 1&GT;通过推迟在后续框架中删除后续儿童。
<强> 2 - ;或者不依赖于帧,我使用了增量时间(自绘制最后一帧以来的时间)。仅在说出0.5秒之后移除一个孩子。
使用上述方法之一,我可以省略睡眠的使用,这可能会占用我的主线程。
以下是详细信息,考虑到我总共有三个孩子要删除: -
<强> 1&GT;通过推迟在后续框架中删除后续儿童。
在当前帧中我将删除第一个孩子,然后将设置一个标志以通知在更新中不做任何事情,而是等待15帧,等待15帧我可以做其他任务也不会对游戏玩法产生影响< / p>
虽然有了这个我可以灵活地等待任意数量的帧,但我必须调节不同设备的帧速率,因为在慢速设备中,等待15帧可能比快速设备花费更多时间,而我不是能够知道cocos2dx是否确实调节了帧率本身,所以我很快就跳到了下一个解决方案。
<强> 2 - ;或者不依赖于帧,我使用了增量时间(自绘制最后一帧以来的时间)。仅在说出0.5秒之后移除一个孩子。
这里没有等待15帧我在Update(float dt)中使用了以下条件: -
if(gameState==WaitForNextChildRemoval)
{
deltaTime=deltaTime+dt;
if(deltaTime>=0.5)
{
releaseNextChild();
deltaTime=0;
}
}
此处无论设备(慢速还是快速),下一个孩子将在0.5秒后被移除。 我认为应该做的一个改进是当deltaTime超过1秒时,然后它不是仅移除下一个孩子,而是应该一次移除两个孩子(每个孩子0.5秒),因为玩家期望移除一个孩子0.5秒后所以deltaTime为1秒(大约),我应该平衡这个期望。
请分享您的想法。