添加边界的SKScene(Add boundaries to an SKScene)

2019-10-19 18:47发布

我想写使用苹果的雪碧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);
        }
    }
}

起初,我用applyImpulsedidBeginContact推船回来。 这使得船反弹,但我不想船反弹。 我只是想让它停在边缘。

是什么力量让船停止一旦到达边缘的正确方法? 上面的代码工作的大部分时间,但时不时船射击关闭屏幕。 这是OS X,iOS的不 - 在重要的情况下。

Answer 1:

看看这个链接... iOS7 SKScene如何使一个精灵反弹关闭屏幕的边缘?

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

这应该建立在你的场景的边缘的屏障。

编辑:从苹果这个例子项目还可能是有用的https://developer.apple.com/library/mac/samplecode/SpriteKit_Physics_Collisions/Introduction/Intro.html



Answer 2:

您的代码是不是在什么速度变量代表明确。 请记住,如果速度太高,你的船将有更新之间游历多个点。 例如,你的船的X / Y为(500,500),在当前的更新。 给定一个足够高的速度,你的船可能是在为第二天更新(500,700)。 如果你在你的边界设置为(500650),你的船应该已经过去吧。

我建议你做一个检查最大速度上之前把它应用到你的船。 这应该避免我上面列出的问题。

至于有弹性,有弹性...你尝试设置你的船的self.physicsBody.restitution = 0; ? 归还是物理体的反弹力。 如果您使用自己的屏幕边界,那么我会建议设置的归还= 0为好。



Answer 3:

最好的办法是添加一个矩形的物理体屏幕(边界)左右。 设置边界和球员的碰撞和接触类别,互相交流。 在didBeginContact方法,你可以检查机构已感动,如果他们有,你可以调用一个方法来重定向船。

你的问题是,你的更新方法可能无法检测位置足够频繁船获得前关闭屏幕。



Answer 4:

这将帮助你确定你在斯威夫特屏幕边缘。

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


文章来源: Add boundaries to an SKScene