精灵套件:根据计算的角度旋转节点



所以我正在写一个游戏,其中弓箭手向目标射箭。拍摄速度和角度通过使用用户在屏幕上拖动手指形成的线条的 x 和 y 分量来确定。我在这里难以实现的效果是让我的弓箭手手臂以与上述线与地面形成相同的角度旋转

我在我这样写的控制器类中计算角度(不确定是否所有铸造都不好:[ )

+(CGFloat)calculateAngleToRotateByGivenX:(CGFloat)xComponent Y:(CGFloat)yComponent{
   double oppOverAdj = (double)yComponent/(double)xComponent;
   return -(CGFloat)atan(oppOverAdj);

然后,我将计算出的角度提供给我的弓箭手节点,以用于旋转手臂

-(void)rotateArmByAngle:(CGFloat)angle{
   SKAction *rotateArmBy = [SKAction rotateToAngle:angle duration:0 shortestUnitArc:YES];
   [[self childNodeWithName:@"upperArm"]runAction:rotateArmBy];    
}

都放在场景中,看起来像这样

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint currentPosition = [touch locationInNode:self];
    CGPoint previousPosotion = [touch previousLocationInNode:self];
    [player rotateArmByAngle:[PSSpriteController calculateAngleToRotateByGivenX:intialTouchPosotion.x-currentPosition.x Y:initialTouchPosition.y-currentPosition.y]];   
}

测试时,手臂会旋转,但不会完全达到我期望的角度。我正在寻找任何建议来获得我的工作,或者如果应该采取完全不同的方法,我也很乐意试一试,谢谢。如果还有更多信息有用,也请告诉我。

你可以尝试以下代码,根据用户的触摸位置旋转精灵:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint positionInScene = [touch locationInNode:self];
    float deltaX = positionInScene.x;
    float deltaY = positionInScene.y;
    float angle = atan2f(deltaY, deltaX) + M_PI_2;
    player.zRotation = angle;
}

最新更新