2.3 旋转僵尸
僵尸移动的很不错,但是它总是朝着相同的方向。实际上,它是“亡灵”,但是,这个僵尸总是对什么都好奇,它很想在移动的时候转身到处看看。
我们已经有了一个向量指向僵尸所要朝向的方向,这就是速度向量。只需要找出一个旋转角度,让僵尸朝向该方向就可以了。
再一次,把方向向量当做是直角三角形的斜边,就可以找到这个角度,如图2-22所示。
图2-22
你可能还记得,三角学中所谓的正切函数,表示为:
tan(angle) = opposite / adjacent
既然有了对边和邻边的长度,可以将上面的公式重写为如下的形式,来得到需要旋转的角度:
angle = arctan(opposite / adjacent)
如果回忆不起来任何三角学的知识,也不要担心。只要把这当做是计算角度的一个公式就可以了,只需要知道这些就够了。
尝试使用这个公式,添加如下的新的方法:
func rotateSprite(sprite: SKSpriteNode, direction: CGPoint) {
sprite.zRotation = CGFloat(
atan2(Double(direction.y), Double(direction.x)))
}
这里用到了上面的公式。它包括很多的强制转型,因为CGFloat在64位的机器上定义为一个Double,而在32位的机器上则定义为一个Float。
这能够有效,是因为僵尸图像本身是朝向右边的。如果僵尸图像是朝向屏幕上方的,还必须添加一个额外的旋转来进行补偿,因为角度0本来是指向右边的。
现在,在update()方法的末尾调用这个新的方法。
rotateSprite(zombie, direction: velocity)
编译并运行,僵尸已经旋转到面朝它移动的方向了,如图2-23所示。
图2-23
恭喜你,已经让僵尸具有了生命了!这个精灵现在在iPhone和iPad上都能够平滑地移动,可以从屏幕弹回并且会旋转,是开始玩这个游戏的最佳时机了。但是,我们还没有大功告成。应该自己尝试一些内容,以确定已经学到了知识。
时间: 2024-10-03 16:07:47