2014-01-30 1 views
0

나는 Cocos2D 및 Kobold2D를 사용하여 게임을 만들고 있습니다. 내가가 예상대로CCMoveTo 인해 점프

KKInput * input = [KKInput sharedInput]; 
CGPoint tap = [input locationOfAnyTouchInPhase:KKTouchPhaseBegan]; 
if (tap.x != 0 && tap.y != 0) 
{ 
    [ship stopAllActions]; // Nullifies previous actions 
    int addedx = tap.x - ship.position.x; 
    int addedy = tap.y - ship.position.y; 
    int squaredx = pow(addedx, 2); 
    int squaredy = pow(addedy, 2); 
    int addedSquares = squaredx + squaredy; 
    int distance = pow(addedSquares, 0.5); 
    [ship runAction: [CCMoveTo actionWithDuration:distance/100 position:tap]];//makes ship move at a constant speed 
} 

배는 일반적으로 이동 : 내 게임에서, 나는이 코드를 사용하여, 플레이어가 탭 곳으로 이동하려는 배를 가지고있다. 그러나, 내가 탭 위치로 부드럽게 움직이는 대신 배 근처에서 탭하면 그 위치로 점프합니다. 이 문제를 어떻게 해결할 수 있습니까?

+0

이있다. – Renaissance

답변

0

논리는 맞지만 계산 정확도가 떨어집니다. 특히 비행 거리를 거리/100으로 계산할 때. 거리가 < 100이면 결과가 0이므로 배가 목적지로 점프하고 있음을 의미합니다.

기본적으로 cocos2d에서 위치를 처리 할 때는 int 대신 float를 사용해야합니다. 그리고 몇 가지 기능이 잘 작동 할 수 있습니다.

당신이 당신의 코드를 변경할 수 있습니다 actionWithDuration, 당신은 CCMoveTo의 행동에 제공되기 때문에

[ship stopAllActions]; // Nullifies previous actions 
float distance = ccpDistance(tap, ship.position); 
[ship runAction: [CCMoveTo actionWithDuration:distance/100.0f position:tap]]; 
0

먼저 두 점 사이의 거리를 계산하기 위해 ccpDistance cocos2d 함수를 사용할 수 있습니다. 그리고 거리가 너무 가깝게 너무 가볍게 누르는 경우 2 or 10 ...으로 나눠서 100 예를 들어 5/100 = 0.05으로 너무 작아서 점프하는 것이기 때문에 점프합니다. 수동으로 처리해야합니다. if(speed<1) speed++;과 같은 것으로 속도를 높이기 위해 1을 추가하는 것이 좋습니다. 바로 가기 솔루션 :)