我正在尝试使用 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,以防万一。