我正在尝试创建一个小型游戏,其中SpriteNode(又名Player)以恒定的速度垂直向上移动。我想用它的角度向左或向右转向。但是,我无法使用其角度正确移动播放器。
谢谢您的时间。
这是我写的部分代码:
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
if let touch = touches.first {
let location = touch.previousLocation(in: self)
if location.x < self.size.width / 2 && location.y < self.size.height / 2 {
// Turn Left
print("TURNING LEFT")
turn(left: true)
} else if location.x >= self.size.width / 2 && location.y < self.size.height / 2 {
// Turn Right
print("TURNING RIGHT")
turn(left: false)
} else if location.y > self.size.height / 2 {
// Go Up
print("GOING UP!")
move()
}
}
}
func turn(left: Bool) {
if left {
// Turn Left
let turnAction = SKAction.rotate(byAngle: 0.1, duration: 0.05)
let repeatAction = SKAction.repeatForever(turnAction)
player?.run(repeatAction)
} else {
// Turn Right
let turnAction = SKAction.rotate(byAngle: -0.1, duration: 0.05)
let repeatAction = SKAction.repeatForever(turnAction)
player?.run(repeatAction)
}
}
func move() {
// Move Up
let moveAction = SKAction.moveBy(x: 0, y: 15, duration: 0.5)
let repeatAction = SKAction.repeatForever(moveAction)
player?.run(repeatAction)
}
答案 0 :(得分:1)
使用三角函数,可以确定子画面在任一方向上的x和y速度,从而为子画面指向一个角度。 here可以找到一篇很棒的文章,总结了如何做到这一点。
如果您只是想真正旋转精灵,可以通过创建旋转的SKAction并在节点上运行操作来完成。
// Create an action, duration can be changed from 0 so the user can see a smooth transition otherwise change will be instant.
SKAction *rotation = [SKAction rotateByAngle: M_PI/4.0 duration:0];
//Simply run the action.
[myNode runAction: rotation];
答案 1 :(得分:0)
由于@ makertech81链接,我能够编写以下有效的代码:
func move() {
// Move Up
let playerXPos = sin((player?.zRotation)!) * -playerSpeed
let moveAction = SKAction.moveBy(x: playerXPos, y: playerSpeed, duration: 0.5)
let repeatAction = SKAction.repeatForever(moveAction)
player?.run(repeatAction)
}
基本上,因为我知道通过zRotation
的角度,并且我也知道Player会向Y方向移动多少,所以我能够计算出其sin
(X值)。因此,可以正确地将moveAction计算到其目的地。
希望有帮助。