1

我正在尝试使用 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

4 回答 4

1

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

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

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

于 2014-04-07T00:38:16.007 回答
1

查看此链接... iOS7 SKScene 如何使精灵从屏幕边缘反弹?

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

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

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

于 2014-04-07T00:39:35.617 回答
1

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

您的问题是您的更新方法在船舶离开屏幕之前可能没有足够频繁地检查位置。

于 2014-04-10T15:25:28.830 回答
0

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

self.physicsBody = SKPhysicsBody ( edgeLoopFromRect: self.frame )
于 2015-08-10T09:53:40.853 回答