是否有一种相对简单的方法来旋转SKSpriteNode,使其始终朝向正在移动的方向?我的类Gamescene有一个物体系统,它们的相对物理体在碰撞时互相施加冲动。这使得跟踪对象移动的确切方向变得相对困难。一些对象也没有规律地形状,这使得事情变得更加混乱。我尝试过使用三角函数(例如arctangent),但它只能在非常特殊的情况下使用。可能有办法找出SKSpriteNode轨迹的角度,这样我就可以将物体旋转到那个角度?感谢您的任何帮助,您可以提供!
编辑:
我为CGVector创建了一个扩展,并试图在两个对象发生碰撞时沿其速度方向旋转SKSpriteNode(感谢0x141E),但它似乎没有正常工作
func didBeginContact(contact: SKPhysicsContact) {
var firstBody : SKPhysicsBody = contact.bodyA
var secondBody : SKPhysicsBody = contact.bodyB
if ((firstBody.categoryBitMask == PhysicsCatagory.Blade) && (secondBody.categoryBitMask == PhysicsCatagory.Laser))
{
if (secondBody.node != nil)
{
if (saberAngle <= 0 && LCR == 1) // Blade pointing right
{
let rebound = CGVectorMake(-reboundStrength*sin(1.5707 + saberAngle), reboundStrength*cos(1.5707 + saberAngle))
secondBody.applyImpulse(rebound)
}
else if (saberAngle > 0 && LCR == -1) // Blade pointing left
{
let rebound = CGVectorMake(reboundStrength*sin(1.5707 - saberAngle), reboundStrength*cos(1.5707 - saberAngle))
secondBody.applyImpulse(rebound)
}
if (secondBody.velocity.speed() > 0.01){
(secondBody.node as! SKSpriteNode).zRotation = secondBody.velocity.angle() - offset
}
}
}
}
我没有在didSimulatePhysics()方法中执行此操作,因为有时我尝试旋转的节点将不存在,并且我会收到错误,例如&#34;使用未解析的标识符&# 39;子画面&#39;&#34;
编辑:
我通过简单地创建并运行一个名为rotate的动作来实现它的工作,该动作将精灵旋转到secondBody.velocity.angle() - offset,但我仍然很好奇我的代码为什么不是在^^之前工作
答案 0 :(得分:8)
沿着运动方向旋转精灵是相当简单的。您可以通过将精灵速度的x
和y
分量转换为atan2
函数的角度来实现此目的。只有当精灵的速度大于某个标称值时才应该旋转精灵,以防止精灵在精灵的速度(接近)为零时重置为零度。
如果我们通过
扩展CGVector
来计算速度和角度的速度和角度
extension CGVector {
func speed() -> CGFloat {
return sqrt(dx*dx+dy*dy)
}
func angle() -> CGFloat {
return atan2(dy, dx)
}
}
我们可以使用
将精灵旋转到其运动方向override func didSimulatePhysics() {
if let body = sprite.physicsBody {
if (body.velocity.speed() > 0.01) {
sprite.zRotation = body.velocity.angle() - offset
}
}
}
offset = CGFloat(M_PI_2)
如果您的精灵在zRotation
为零时面朝上,offset = 0
,zRotation
如果您的精灵在 $(document).ready(function(){
$("button").click(function(){
$("#f1").attr('style','display: block !important')
});
});
为零时面向右侧。