为SKScene添加边界

时间:2014-04-06 21:31:33

标签: objective-c macos sprite-kit skphysicsbody

我正在尝试使用Apple的Sprite Kit框架编写基本游戏。到目前为止,我有一艘船在屏幕上飞行,使用SKPhysicsBody。我想让船离开屏幕,所以我编辑了我的更新方法,使船的速度为零。这种情况大部分时间都有效,但船只会不时地从屏幕上飞出来。

这是我的更新方法。

// const int X_MIN = 60;
// const int X_MAX = 853;
// const int Y_MAX = 660;
// const int Y_MIN = 60;
// const float SHIP_SPEED = 50.0;

- (void)update:(CFTimeInterval)currentTime {
    if (self.keysPressed & DOWN_ARROW_PRESSED) {
        if (self.ship.position.y > Y_MIN) {
            [self.ship.physicsBody applyForce:CGVectorMake(0, -SHIP_SPEED)];
        } else {
            self.ship.physicsBody.velocity = CGVectorMake(self.ship.physicsBody.velocity.dx, 0);
        }
    }

    if (self.keysPressed & UP_ARROW_PRESSED) {
        if (self.ship.position.y < Y_MAX) {
            [self.ship.physicsBody applyForce:CGVectorMake(0, SHIP_SPEED)];
        } else {
            self.ship.physicsBody.velocity = CGVectorMake(self.ship.physicsBody.velocity.dx, 0);
        }
    }

    if (self.keysPressed & RIGHT_ARROW_PRESSED) {
        if (self.ship.position.x < X_MAX) {
            [self.ship.physicsBody applyForce:CGVectorMake(SHIP_SPEED, 0)];
        } else {
            self.ship.physicsBody.velocity = CGVectorMake(0, self.ship.physicsBody.velocity.dy);
        }
    }

    if (self.keysPressed & LEFT_ARROW_PRESSED) {
        if (self.ship.position.x > X_MIN) {
            [self.ship.physicsBody applyForce:CGVectorMake(-SHIP_SPEED, 0)];
        } else {
            self.ship.physicsBody.velocity = CGVectorMake(0, self.ship.physicsBody.velocity.dy);
        }
    }
}

首先,我在applyImpulse中使用了didBeginContact来推回船只。这使得船只反弹,但我不希望船只反弹。我只是想让它停在边缘。

一旦船到达边缘,使船停下来的正确方法是什么?上面的代码大部分时间都可以工作,但是船不时会在屏幕上拍摄。这适用于OS X而非iOS - 如果重要的话。

4 个答案:

答案 0 :(得分:1)

您的代码不清楚速度变量代表什么。请记住,如果速度太高,您的船将在更新之间移动多个点。例如,您船舶的X / Y在当前更新时为(500,500)。如果速度足够高,您的船在下次更新时可能会达到(500,700)。如果你的边界设置为(500,650),那么你的船已经过了它。

我建议您在将速度应用到船上之前对速度进行最大程度的检查。这应该避免我上面概述的问题。

至于弹性,有弹性......你是否试过设置你的船self.physicsBody.restitution = 0;?恢复原状是物理机构的弹性。如果您使用自己的屏幕边界,那么我建议将它们设置为恢复= 0。

答案 1 :(得分:1)

查看此链接... iOS7 SKScene how to make a sprite bounce off the edge of the screen?

[self setPhysicsBody:[SKPhysicsBody bodyWithEdgeLoopFromRect:self.frame]];  //Physics body of Scene

这应该在场景边缘设置一个障碍。

编辑: Apple的这个示例项目也可能很有用 https://developer.apple.com/library/mac/samplecode/SpriteKit_Physics_Collisions/Introduction/Intro.html

答案 2 :(得分:1)

你最好的选择是在屏幕(边界)周围添加一个矩形物理体。设置边界和玩家的碰撞和接触类别以相互交互。在didBeginContact方法中,您可以检查主体是否已触摸,如果有,则可以调用方法来重定向船。

您的问题是您的更新方法可能无法在船舶离开屏幕之前经常检查位置。

答案 3 :(得分:0)

这将帮助您在Swift中定义屏幕边缘。

self.physicsBody = SKPhysicsBody ( edgeLoopFromRect: self.frame )