2

我似乎在计算精灵和触摸点之间的角度时遇到了问题。每当用户触摸屏幕时,我试图让我的精灵直接面对触摸点的方向。这是我的代码:

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    CGPoint tapPosition;
    for (UITouch *touch in touches){
        CGPoint location = [touch locationInView:[touch view]];
        tapPosition = [self convertToNodeSpace:[[CCDirector sharedDirector] convertToGL:location]];
    }

    float angle = CC_RADIANS_TO_DEGREES(ccpAngle(fish.position, tapPosition));
    [fish runAction:[CCRotateTo actionWithDuration:0.5 angle:angle]];
}

有任何想法吗?谢谢

4

3 回答 3

4

将此添加到 Nikhil 答案的末尾,以避免当触摸位置位于精灵的右下角时获得负角度。

if (calculatedAngle < 0) 
{
     calculatedAngle+=360;
}
于 2012-11-03T04:53:23.000 回答
3

试试这个,首先你不需要那个 for 循环,因为无论如何你都会得到最后一个触摸位置。您也可以使用 [touches anyObject] 如下。

其次,我不确定 ccpAngle 做了什么,但是当这样的宏不起作用时,有时自己做数学会更容易。

-(void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
   CGPoint tapPosition;
   UITouch *touch = [touches anyObject];

   CGPoint location = [touch locationInView:[touch view]];
   tapPosition = [self convertToNodeSpace:[[CCDirector sharedDirector] convertToGL:location]];

   float dY = fish.position.y - tapPosition.y;
   float dX = fish.position.x - tapPosition.x;
   float offset = dX<0 ? 90.0f : -90.0f;
   float angle = CC_RADIANS_TO_DEGREES(atan2f(dY, dX)) + offset;

   [fish runAction:[CCRotateTo actionWithDuration:0.5 angle:angle]];
}

您可能也可以用 ccpDiff 中的一个点替换 dX 和 dY ,但这并不重要。另外,根据鱼头的位置,您可能需要调整角度偏移,但我将由您决定。

让我知道这是否有帮助。

于 2012-05-16T09:50:24.287 回答
3

CCPoint pos1 = [鱼的位置];CCPoint pos2 = 触摸位置;

float theta = atan((pos1.y-pos2.y)/(pos1.x-pos2.x)) * 180 * 7 /22;

float calculatedAngle;

if(pos1.y - pos2.y > 0)
{
    if(pos1.x - pos2.x < 0)
    {
        calculatedAngle = (-90-theta);
    }
    else if(pos1.x - pos2.x > 0)
    {
       calculatedAngle = (90-theta);
    }       
}
else if(pos1.y - pos2.y < 0)
{
    if(pos1.x - pos2.x < 0)
    {
       calculatedAngle = (270-theta);
    }
    else if(pos1.x - pos2.x > 0)
    {
       calculatedAngle = (90-theta);
    }
}

在你的跑步动作中使用这个计算的角度..希望这会有所帮助...... :)

于 2012-05-18T08:34:33.980 回答