2012-01-12 10 views
2

私は何が問題なのか分かりません。私はベクトルの角度を見つけるためにccpToAngle()を使用していますが、適切な角度を得ることはできません。私のボールはcpp(170,40)で開始/初期位置にあり、スワイプを使ってスローしたい。
私は角度を大きくするより、その後スワイプ場合、私はここにCocos2dを使ってベクトルの角度を見つける

-(void) ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event { 

    CGPoint location = [touch locationInView: [touch view]]; 
    CGPoint vector = ccpSub(location, ccp(170 ,40)); 
    normalVector = ccpNormalize(vector); 
    float angleRads = ccpToAngle(normalVector); 
    float angle = CC_RADIANS_TO_DEGREES(angleRads); 
    } 

、角度を見つけるために書きましたけど。私は、同じ行/方向にスワイプすると、角度が毎回同じであるべきだと思う。しかし、ここでは、70〜90度の角度しか得られません。スワイプすれば角度は60,66度に近くなります。

0度から180度の間の角度が必要です。 ccp(170,40)を軸の起点とみなすことは可能でしょうか?& Cocos2dでベクトルの角度を見つけるのですか?

ありがとうございます。

+0

私はあなた自身でそれを行うために数学ライブラリを使用することをお勧めします。それは非常にシンプルで貴重な知識です。単にオンラインで簡単な三角法のチュートリアルを見てください。 – EmilioPelaez

+0

NSLog(@位置:%.0fx%.0fベクトル:%.0fx%.0f角度:%.0f "、location.x、location.y、vector.x、ベクトルの中に' NSLog'を挿入します。 .y、angle); '。 170x40の周りに指で円を描くと、どこに問題があるのか​​がわかります。 – brigadir

答えて

1

あなたがここに三角法を使用する必要がスワイプの角度を見つけたい場合は...ここで

が、これはあなたがそのボールを検出する方法

- (void) ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    locationTouchBegan = [touch locationInView: [touch view]]; 
    //location is The Point Where The User Touched 
    locationTouchBegan = [[CCDirector sharedDirector] convertToGL:locationTouchBegan]; 
    //Detect the Touch On Ball 
    if(CGRectContainsPoint([ball boundingBox], locationTouchBegan)) 
    { 
     isBallTouched=YES; 
    } 

} 

..あなたを助けることができるいくつかのですが

タッチします

タッチの最後に、方向を計算できます。

- (void) ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { 
    UITouch *touch = [touches anyObject]; 
    locationTouchEnded = [touch locationInView: [touch view]]; 
    locationTouchEnded = [[CCDirector sharedDirector] convertToGL:locationTouchEnded]; 
    [self calculateDirections]; 
} 

これは方向を計算する方法です。

-(void)calculateDirections 
{ 
    if (isBallTouched==YES) 
    { 
     perpendicularBig = screenSize.height - ball.position.x; 
     baseSmall = screenSize.width/2 - locationTouchEnded.x; // if the ball is at center. 
     perpendicularSmall=locationTouchEnded.y - ball.position.x; 
     baseBig=(perpendicularBig*baseSmall)/perpendicularSmall; 
     endPoint=ccp(screenSize.width/2 - baseBig,320); //320 can replace by the value of end point y where you want to end the ball run. 
     [self moveBall:3.0f]; 
    } 
} 
-(void)moveBall:(float)duration 
{ 

    [ball runAction:[CCJumpTo actionWithDuration:duration position:ccp(endPoint.x,endPoint.y) height:20 jumps:1]]; 
    isBallTouched = NO; 
} 
+0

ありがとう、それは私のために働いている! – Ruchi

関連する問題