Cocos2d x 暂停从批处理节点中逐个删除子节点

Cocos2d x 暂停从批处理节点中逐个删除子节点,cocos2d-x,frame-rate,Cocos2d X,Frame Rate,我正在尝试在暂停一段时间后从批处理节点中逐个删除一组子节点。因此,如果有三个孩子,那么第一个家长将立即消失,然后在1秒后第一个孩子将消失,然后在另一秒(总共2秒)后第二个孩子将消失,在另一秒(总共3秒)后第三个孩子将消失 现在,我正在从batchnode中删除它们,如下所示:- batchNode->removeChild(child1,true); sleep(1); batchNode->removeChild(child2,true); sleep(2) batchNode-&

我正在尝试在暂停一段时间后从批处理节点中逐个删除一组子节点。因此,如果有三个孩子,那么第一个家长将立即消失,然后在1秒后第一个孩子将消失,然后在另一秒(总共2秒)后第二个孩子将消失,在另一秒(总共3秒)后第三个孩子将消失

现在,我正在从batchnode中删除它们,如下所示:-

batchNode->removeChild(child1,true);
sleep(1);
batchNode->removeChild(child2,true);
sleep(2)
batchNode->removeChild(child3,true);
但它们都同时从屏幕上消失了!虽然有停顿。是因为它们都是同一个batchNode的一部分,所以对子节点采取的任何操作都将一次性应用


请分享你的想法

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

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

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

我可以做到这一点,我使用了两种不同的方法,如前所述:-

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

2>或者,我使用了delta time(自最后一帧绘制以来的时间),而不是依赖于帧。因此,只有在0.5秒之后才能删除子项。

使用上述任何一种方法,我都可以省略睡眠的使用,这会占用我的主线

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

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

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

虽然有了这个,我可以灵活地等待任意数量的帧,但我必须调整不同设备的帧速率,因为在慢速设备中,等待15帧可能比快速设备花费更多的时间,而且我不知道cocos2dx是否自己调节帧速率,所以我很快跳到下一个解决方案

2>或者,我使用了delta time(自最后一帧绘制以来的时间),而不是依赖于帧。因此,只有在0.5秒之后才能删除子项。

在这里,我没有等待15帧,而是在更新内部使用了以下条件(float dt):-

在这里,无论设备是慢还是快,下一个子设备将在0.5秒后被删除。 我认为应该做的一个改进是,当deltaTime超过1秒时,它应该一次删除两个孩子(每个孩子0.5秒),而不是只删除下一个孩子,因为玩家希望在0.5秒后删除一个孩子,所以deltaTime为1秒(约),我应该平衡这个期望


请分享您的想法。

这是正确的答案!为每个孩子运行一个带有CCDelay和CCCallBlock的CCSequence我们在Cocos2dx中没有CCCallBlock,所以我尝试了CCCallFunc,parent很快消失,延迟后其他两个孩子一起消失。我在循环中使用了3次(删除了全部形状)this->runAction(CCSequence::create)(delayAction,CCCallFunc::create)(this,callfunc\u选择器(GameLayer::releaseChildCallFunc)),NULL(),“此”是GameLayer,所以我尝试了其他方法。现在我快速删除父对象,然后在10帧后删除其子对象,然后在另10帧后删除其他子对象。在等待期间,我在游戏中没有做任何工作。如果帧速率受到管制,那么它应该可以正常工作,请分享您的想法。Bivis能否请您详细说明YvesLeBorg试图通过C实现的目标C结果?我试过了,但没有成功,请阅读上面的评论了解详细信息。是的,你是对的,睡眠会阻止我的主线,请阅读上面答案中的评论,了解我现在的做法。请分享你对此的想法。谢谢
if(gameState==WaitForNextChildRemoval)
{
deltaTime=deltaTime+dt;

if(deltaTime>=0.5)
{
releaseNextChild();
deltaTime=0;
}
}