防止SKSpriteNode离开屏幕

时间:2015-03-16 18:21:16

标签: objective-c sprite-kit skspritenode

我有一个SKSpriteNode,可以使用以下代码随加速度计一起移动:

-(void)processUserMotionForUpdate:(NSTimeInterval)currentTime {
    SKSpriteNode* ship = (SKSpriteNode*)[self childNodeWithName:@"fishderp"];
    CMAccelerometerData* data = self.motionManager.accelerometerData;
    if (fabs(data.acceleration.y) > 0.2) {
        [gameFish.physicsBody applyForce:CGVectorMake(0, data.acceleration.y)];

    }
}

这很好用,但节点(游戏鱼)离开屏幕。如何防止这种情况并将其保留在屏幕上?

2 个答案:

答案 0 :(得分:2)

尝试使用专为此目的而设计并在iOS8中引入的SKConstraint:

只需将其添加到gameFish节点的setup方法即可。物理运行后,游戏引擎将应用约束。你不必担心它。好吧?

// get the screensize
CGSize scr = self.scene.frame.size;

// setup a position constraint
SKConstraint *c = [SKConstraint
                    positionX:[SKRange rangeWithLowerLimit:0 upperLimit:scr.width]
                    Y:[SKRange rangeWithLowerLimit:0 upperLimit:scr.width]];

gameFish.constraints = @[c]; // can take an array of constraints

答案 1 :(得分:0)

代码取决于您是将gameFish节点添加到self还是添加到另一个节点(类似“worldNode”)。如果您已将其添加到自己,请查看以下代码:

// get the screen height as you are only changing your node's y
float myHeight = self.view.frame.size.height;

// next check your node's y coordinate against the screen y range
// and adjust y if required
if(gameFish.position.y > myHeight) {
    gameFish.position = CGPointMake(gameFish.position.x, myHeight);
}

对于底部,您可以检查< 0或您需要的任何值。