与PhysicsBody碰撞时停止SKAction

时间:2014-04-29 15:42:02

标签: ios objective-c sprite-kit accelerometer physics

我有一个SpriteNode仅受y轴的重力影响,可以用x轴上的加速度计移动。我的场景中还有一个边框(SKPhysicsBody),可以将节点保存在场景中。现在的问题是我的节点在执行由加速度计引起的SKAction时忽略边界。

我的x移动/加速度计代码及其动作:

birdNode是我的SpriteNode

float destX = 0.0;


         float currentX = birdNode.position.x;
         BOOL shouldMove = NO;

         if (data.acceleration.x < -0.1) {
             destX = currentX + (data.acceleration.x * playerXSpeed);
             shouldMove = YES;
         }
         else if (data.acceleration.x > 0.1) {
             destX = currentX + (data.acceleration.x * playerXSpeed);
             shouldMove = YES;
         }

         if (shouldMove) {
             if (birdNode.position.x + destX < self.frame.size.width || birdNode.position.x - destX > 0) {

                SKAction *moveBird = [SKAction moveToX:destX duration:0.1];
                 [birdNode runAction:moveBird];
             }
         }

1 个答案:

答案 0 :(得分:1)

我假设您已正确设置碰撞位掩码来处理碰撞。您应该通过测试来确认这一点,以便仔细检查。

我相信你的问题在于对象的速度。如果对象移动太快,并且我在发布的代码中没有看到任何速度限制,则您的对象可以在一个更新周期中移过屏幕边界。

例如,您当前对象的位置是(400,100)。给定足够的速度,您的对象的下一次更新:位置可能是(600,100)。这意味着您的对象实际上跳过边界而不会导致碰撞。

解决方案是在设置对象的新位置之前限制速度或进行位置检查。例如,如果新的x位置是>然后在屏幕宽度上将x位置设置为允许的最大屏幕宽度x。