好的,所以我有一个游戏,玩家(太空飞船)试图绕行星,但如果它关闭,玩家的太空飞船将转向行星。
所以我试图使用:
float dx = [_player position].x - [planetNodes[i] position].x;
float dy = [_player position].y - [planetNodes[i] position].y;
double angleToTurn = (180.0 / M_PI) * atan2(dy, dx);
NSLog(@"Turn to: %f", angleToTurn);
_player.zRotation = angleToTurn;
此代码放在场景的更新方法中。每当玩家离行星太近时它开始旋转,因为我使用的是旋转方法。有没有像setAngle这样的方法?这样,无论何时调用更新,它都会重置角度,实际上看起来像玩家正朝着这个星球移动。
答案 0 :(得分:2)
您正在使用zRotation
属性。设置该属性将产生所需的效果,问题是当你应该给它 radians 时,你给_player.zRotation
一个度的值。当玩家接近行星时,角度会发生变化,并且玩家的旋转速度比应该的速度快180 / pi,因为您将角度乘以该角度。
你想要的是:
angleToTurn = atan2(dy,dx);
而不是
angleToTurn = (180.0 / M_PI) * atan2(dy,dx);
答案 1 :(得分:1)
使旋转角度使用
[_player runAction:[SKAction rotateToAngle:atan2(dy, dx) duration:0.0 shortestUnitArc:YES]]
精灵运动将被动画化并且看起来比设置zRotation好得多。
注意:该函数采用弧度,因此无需转换为度数。