0

我试图在暂停后一个一个地从批处理节点中删除一组子节点。因此,如果有三个孩子,那么第一个父母会立即消失,然后 1 秒后第一个孩子会消失,然后再过 1 秒(共 2 秒)第二个孩子会消失,再过 1 秒(共 3 秒)第三个孩子会消失消失。

现在我正在从批处理节点中删除它们,例如:-

batchNode->removeChild(child1,true);
sleep(1);
batchNode->removeChild(child2,true);
sleep(2)
batchNode->removeChild(child3,true);

但它们都同时从屏幕上消失了!虽然有停顿。是不是因为它们都是同一个 batchNode 的一部分,所以对孩子采取的任何行动都将一次性应用。?

请分享你的想法

4

3 回答 3

1

即,它们在 3 秒后一起消失?基本上,我认为睡眠实际上阻塞了主线程,所以更新和绘制周期只会在你的最后一个语句之后恢复。

我会通过运行某种 CCSequence 来做类似的事情,并使用延迟操作和 callBlock 操作来正确级联。这都是在主线程中执行的,因此在级联期间会刷新显示。

于 2013-10-23T14:56:47.097 回答
0

Sleep() 参数通常以毫秒为单位,因此请尝试 sleep(1000); 在第二行和第四行。另外,也许,您最好使用 Actions(CCSequence 填充 CCDelay 和 CCCallFunc)而不是 sleep(),它会阻止您的所有游戏。

于 2013-10-24T19:35:20.180 回答
0

我能够做到,我使用了两种不同的方法:-

1> 通过推迟移除后续帧中的后续子项。

2> 或者不依赖于帧,我使用了增量时间(自上一帧绘制以来的时间)。所以仅在 0.5 秒后删除一个孩子。

使用上述任何一种方式,我都可以省略使用可以占用我的主线程的睡眠。

以下是详细信息,考虑到我总共要删除三个孩子:-

1> 通过推迟移除后续帧中的后续子项。

在当前帧中,我将删除第一个孩子,然后设置一个标志,通知在更新中不要做任何事情,只等待 15 帧,在等待 15 帧时,我还可以执行其他任务,这对游戏玩法没有影响

虽然有了这个我可以灵活地等待任意数量的帧,但是我必须调节不同设备的帧速率,因为在慢速设备中,等待 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 sec 时,而不是只移除下一个孩子,它应该一次性移除两个孩子(每个 0.5 秒),因为玩家期望移除一个孩子在 0.5 秒后,因此 deltaTime 为 1 秒(大约),我应该平衡这个期望。

请分享你的想法。

于 2013-10-26T12:40:33.610 回答