gpt4 book ai didi

ios - 持续时间为 0.0 的 SpriteKit 自定义操作在第一次运行时被调用两次

转载 作者:行者123 更新时间:2023-12-01 18:15:33 24 4
gpt4 key购买 nike

我不确定这是错误还是我做错了什么,但是当我尝试运行持续时间为 0.0 的自定义操作时,该 block 运行两次。例如,如果我将此代码放在场景的 init 方法中,我会得到以下输出:

SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
[self runAction:doThis];



2014-03-13 01:41:11.271 Leapfrog[2168:60b] DO THIS
2014-03-13 01:41:11.287 Leapfrog[2168:60b] DO THIS

如果我尝试按顺序运行两个 Action ,第一次执行两次,第二次执行一次,如下所示:
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
SKAction *doThat = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THAT");
}];
NSArray *actions = [NSArray arrayWithObjects:doThis, doThat, nil];
SKAction *sequence = [SKAction sequence:actions];
[self runAction:sequence];



2014-03-13 01:46:11.910 Leapfrog[2184:60b] DO THIS
2014-03-13 01:46:11.926 Leapfrog[2184:60b] DO THIS
2014-03-13 01:46:11.942 Leapfrog[2184:60b] DO THAT

到目前为止,我想出如何让它正常运行的唯一方法是在开头包含一个虚拟 Action :
SKAction *wait = [SKAction waitForDuration:0.0];
SKAction *doThis = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THIS");
}];
SKAction *doThat = [SKAction customActionWithDuration:0.0 actionBlock:^(SKNode *node, CGFloat elapsedTime) {
NSLog(@"DO THAT");
}];
NSArray *actions = [NSArray arrayWithObjects:wait, doThis, doThat, nil];
SKAction *sequence = [SKAction sequence:actions];
[self runAction:sequence];



2014-03-13 01:48:41.946 Leapfrog[2192:60b] DO THIS
2014-03-13 01:48:41.964 Leapfrog[2192:60b] DO THAT

每次我想做这种事情时,我是否都陷入了持续时间为零的等待 Action ?

最佳答案

解释

'cutomActionDuration' 以秒为单位, Action 一直执行到 '1 秒' 结束。在“0 到 1”秒之间有足够的时间来执行 Action (例如,一秒有 1000 毫秒)。根据您使用的机器/PC 的速度,您将看到执行多次或一次的操作。

使用 RunBlock 的解决方案

'customActionWithDuration' 用于重复操作。如果您想在有“runBlock”操作可用时执行操作。缺点是您不能将节点作为参数传递给 block 。但是您可以使用其他技巧来克服这个缺点(例如,在运行 block 之前将节点存储在某个全局变量中。该 block 将为全局节点执行)。这是示例:

SKAction* blockAction = [SKAction runBlock:^{
//your actions here
[SomeNode.physicsBody applyImpulse:(10,10)];

}];

[SomeNode runAction:blockAction];

使用 cutomActionWithDuration 的解决方案

如果您仍想使用“customActionWithDuration”。我有工作
SKAction* applyImpulse =[SKAction customActionWithDuration:0.000001      actionBlock:^(SKNode *node, CGFloat elapsedTime) {
if(!(elapsedTime>0)){
//Do your thing here :)
}

}];

关于ios - 持续时间为 0.0 的 SpriteKit 自定义操作在第一次运行时被调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22370170/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com