将一个 SKSpriteNode 的移动与另一个 SKSpriteNode 的旋转同步



https://i.stack.imgur.com/JQ9r6.png

上面你可以看到我的游戏图片。我有敌人在 y 轴上生成并向下移动。玩家应该在敌人到达墙壁之前击落他们。就像现在一样,播放器正在旋转到触摸的位置。我想要的是让子弹与旋转的方向相同。就像现在一样,子弹只是直奔前进。这是项目符号的代码。

func spawnBullets(towards point: CGPoint) {
let bullet = SKSpriteNode(imageNamed: "Bullet")
bullet.zPosition = 1
bullet.position = CGPoint(x: player.position.x + 19, y: 
player.position.y)
let action = SKAction.move(to: point, duration: 
TimeInterval(1))
bullet.run(SKAction.repeatForever(action))
self.addChild(bullet)
}

这是我用于旋转播放器的代码:

static let Pi = CGFloat(Double.pi)
static let DegreesToRadians = Pi / 180 
override func touchesMoved(_ touches: Set<UITouch>, with event: 
UIEvent?) {
let curTouch = touches.first!  
let curPoint = curTouch.location(in: self)
let deltaX = self.player.position.x - curPoint.x
let deltaY = self.player.position.y - curPoint.y
let angle = atan2(deltaY, deltaX)
self.player.zRotation = angle + 90 * GameplayScene.DegreesToRadians
}

如何使子弹的方向和玩家的旋转"同步"?

你旋转播放器。这一切都很好。但是,如果要使用 SKAction,则不会考虑旋转。它只是陈述了一个绝对的立场。

你想要的是将项目符号移向触摸位置(用点,而不仅仅是Y(:

spawnBullet(towards point: CGPoint) {
// ...
let action = SKAction.moveTo(location: point, duration: 3.0)
}

然后将触摸位置传递给函数。您需要为动作获得适当的持续时间,以便子弹以所需的速度行进。

最新更新