1

我目前正在将我的一个项目转换为SpriteKit,而我在转换animateWithDurationSKAction MoveByY: duration: First 时遇到了一些麻烦,因为它animateWithDuration为您提供了一种很好的加速和减速的美感,而SKAction. 烦人,但不会破坏游戏。其次是animateWithDuration立即计算其结束位置,而SKAction不断计算其位置。这对我来说是个问题,因为我有一个游戏板,其中一排spriteNodes正在向下移动。如果该行中间的一个节点被删除,我需要该节点下方的节点向上移动到现在的空缺位置。这意味着他们要去一个移动的目标,并使用SKAction他们超越了位置。我可以通过添加另一个来解决这个问题SKAction,但是我必须考虑到碎片以不同的速度下落,并且它开始快速变得混乱。我想知道是否有人有一个不涉及猜测的干净的解决方案?理想情况下,我会在animateWithDuration上运行spriteNode,但不幸的是,这不起作用。

这是我最初的动画代码:

[UIView animateWithDuration:collapseSpeed animations:^{[[[_activePiecesVerticalOne objectAtIndex:piecesInArrayOne - 1] imageView] setCenter:CGPointMake (30, _positionOfLastObjectArrayOne )]; }];

这是我的新代码:

SKAction *collapseUp = [SKAction moveToY:positionOfLastObjectArrayOne duration:collapseSpeed];
collapseUp.timingMode = SKActionTimingEaseInEaseOut;  //thanks Can!
SKAction *correctPosition = [SKAction moveByX:0 y:correctionVariable duration:.1];
SKAction *theAnimation = [SKAction group:@[collapseUp, correctPosition]];

[[_fallingPiecesRowOne objectAtIndex:piecesInArrayOne - 1] runAction:theAnimation];

向 Can 道歉,因为我实际上已经在使用 moveTo 而不是 moveBy。变量correctPosition =fallingPiecesSpeed * 25。fallingPieceSpeed 是-.1,这是通过更新方法每0.01 秒移动每个下落部分的距离。我合理化了在 0.25 秒内制作动画所需的 25 个 -.1 运动增量,因此实施此操作以尝试解决我的问题。我相信使用 animateWithDuration,这些运动增量将被存储并在它下落时应用到它,这是我在 SKAction 中所缺少的。只要我将fallPieceSpeed 保持在-.1,这个解决方案似乎就可以正常工作,但是将其提高到-.3 会使我在碎片的最终位置上出现重大不一致。

希望这是有道理的。正如我所提到的,我希望用一种更清洁的方法绕过所有这些,但我可能不得不继续修改它才能找到我的解决方案:S

4

1 回答 1

3

如果您使用的是animateWithDuration:,我假设您知道最终位置,对吗?然后,而不是使用SKAction +moveByY:duration:use SKAction +moveToY:duration:

而你想要的“超速”是一个简单的计时功能,在 SKAction 的情况下,可以在实例对象上更改SKAction -setTimingMode:

所以本质上:

SKAction *action = [SKAction moveToY:someYValue duration:0.15];
action.timingMode = SKActionTimingEaseInEaseOut;

编辑

我很难评估这个问题,涉及的东西很多,我对 SpriteKit 的了解也不大,但我知道 Core Animation。

我最大的担心是您从 SpriteKit 中获取的值可能尚未完全提交给模型层。注意这个术语,层有两种形式,模型层和表示层,模型层保留层的实际属性,表示层是具有当前动画属性的中间层。您实际上可以通过view.layer.presentationLayer.

处理动画的一般经验法则是通过相对值来做所有事情。所以需要向上移动的行应该基于一个固定的量(精灵的高度),所以moveByY:它并不像最初看起来那么糟糕,但要确保一切都是相对的。

另一种选择是您使用 SKPhysics,其中最后一行不断推动事物,而所有其他部分随着重力/弹性而下降。

于 2014-01-07T19:01:17.413 回答