Ios 与PhysicsBody碰撞时停止SKAction

Ios 与PhysicsBody碰撞时停止SKAction,ios,objective-c,sprite-kit,accelerometer,physics,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 =

我有一个
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];
             }
         }
float destX=0.0;
浮动电流x=birdNode.position.x;
BOOL shouldMove=否;
如果(数据加速度x<-0.1){
destX=currentX+(data.acceleration.x*playerXSpeed);
shouldMove=是;
}
否则如果(data.acceleration.x>0.1){
destX=currentX+(data.acceleration.x*playerXSpeed);
shouldMove=是;
}
如果(应该移动){
if(birdNode.position.x+destX0){
SKAction*moveBird=[SKAction-moveToX:destX持续时间:0.1];
[birdNode运行操作:moveBird];
}
}

我假设您已经正确设置了冲突位掩码来处理冲突。您应该通过测试来确认这一点,以进行双重检查

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

例如,当前对象的位置为(400100)。给定足够的速度,对象的下一个更新:位置可能是(600100)。这意味着您的对象实际上跳过了边界,而没有造成碰撞


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

变量“data.acceleration.x”和“playerXSpeed”代表什么?data.acceleration.x是来自加速计的值,playerXSpeed设置速度,设置为80否,这不是问题。这个动作与物理没有任何共同之处——我认为这就是为什么我的节点忽略了边界的问题。我试着做了一次检查,但还是不起作用。。我已经更新了我的code@DavidP-添加代码NSLog(@“self:%@),NSStringFromCGPoint(yourObjectName.position));进入update:method,查看帧与帧之间x坐标的变化有多大。范围不是很大。。在140到280之间,在视野范围内。当对象跳出视图时,x位置如何?节点达到-2000