2013-02-18 3 views
1

이 질문은 프로그래밍 질문보다 더 많은 질문이기 때문에이 포럼에서 받아 들일 수있는 질문이되기를 바랍니다.회전에 따른 스프라이트의 이동

나는 cocos2d 프레임 워크를 사용하여 기본 우주 사수 게임을 개발 중입니다. 사용자가 우주선을 조종하고 소행성/적을 쏘고 적들이 우주선 (원래 어떨까요?)에서 다시 사격합니다.

적들에 의해 발사되는 '레이저'는 튜브 모양이며 일반적으로 x 축에서 오른쪽에서 왼쪽으로 만 이동합니다. 그래서,

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - ((screenSize.width/kLaserSpeed)* dtSixty), currentEnemyProjectile.position.y); 

가 나는 또한 특정 적이 화면의 중앙에 상주하며 우주선에서의 발사체를 발사 회전이 달성하기 쉬운, 그리고 운동은 코드 줄이 만들어집니다 우주선이 적과 다른 y 위치에 있으면 발사체 스프라이트가 회전하고 우주선의 위치로 이동하므로 y 축을 통과해야합니다. 나는 현재이를 달성하기 위해 코드를 사용하고

: 난 그냥 임시 수정으로이 운동했다

float xDiff = ((screenSize.width/kLaserSpeed)* dtSixty); 
float yDiff = (xDiff/57) * currentEnemyProjectile.rotation; 

currentEnemyProjectile.position = ccp(currentEnemyProjectile.position.x - xDiff, currentEnemyProjectile.position.y + yDiff); 

, 나는이 일을하는 최적의 방법이 아니다 알고있다. 그것은 일종의 일이지만, x 축을 따라 이동하는 것으로부터 y 오프셋을 계산할 때, 그들은 y 축을 따라 더 멀리 이동해야한다면 더 빠르게 움직일 것입니다. 이상적으로는 x 축을 따라 상향 또는 하향으로 움직이는 경우 느리게 움직여야하므로 궤적에 대한 이동 속도는 일정합니다. (내가 충분히 설명했으면 좋겠다.)

마지막으로 수학 수업을 한 지 약 10 년이되었으므로 나의 기하학/삼각법은 다소 흐릿하거나 존재하지 않는다. 끝내라?

또한 cocos2d 작업을 사용하지 않고이 작업을 수행하고 싶습니다. 이제는 게임의 일부로 시간 흐름을 조작하면서 현재 각 프레임마다 스프라이트를 이동하려고하므로 cocos2d 액션이 제공 할 수있는 것보다 더 많은 제어가 필요합니다.

미리 도움을 청하십시오.

+0

약간의 변수로 혼란스러워합니다. kLaserSpeed는 거리/초 단위이어야합니다. dtSixty는 60Hz 클럭 속도의 델타 시간과 비슷합니까? xDiff가 화면 너비에 의존하는 이유는 무엇입니까? 이동 거리를 구하기 위해 속도 * dt를 곱하면 삼각형의 빗변을 따라 "d"라고 부르기 만하면됩니다. 그래서 dx = d * sin (각)과 dy = d * cos (각). 적절한 사인을 확인하십시오. – Pat

+0

화면의 너비를 kLaserSpeed로 나누는 이유는 다른 장치 (iPhone 4/iPhone 5/ipad)에서 일정한 게임 플레이 경험을 제공하기 때문입니다. 예를 들어 kLaser 속도가 500이면 개체가 1/500 너비로 이동합니다 화면 크기에 관계없이 화면의 dtSixty는 마지막 프레임이 60을 곱한 이후의 시간입니다. 나는 원래 프레임 속도를 조정하지 않고 원래 프로젝트를 시작 했으므로, 나중에 60fps로 실행하고 싶었을 때 마지막 프레임 이후의 시간을 60으로 곱하면 같은 수치를 유지할 수있었습니다. 속도. – SteveB

+0

나는 당신이 게임을하는 방정식을보고, 내가 작동하도록 할 수 있는지 알아 보겠다. 나는 내 삼각법을 조금 닦아 낼 수 있다고 생각한다! 도와 주셔서 감사합니다. – SteveB

답변

0

가 시작 위치, 각도 및 거리를 사용하여 위치를 찾으려면 공식은 다음과 같다 : 명심

ccp(x + (distance * sin(angle)), y + (distance * cos(angle))) 

이 공식의 각도에 있어야됩니다 라디안,도가 아닙니다. 다음과 같이도를 라디안으로 변환 할 수 있습니다.

radians = degrees * PI/180 
+0

이것은 완벽하게 작동합니다. 덕분에 너무 많이! – SteveB

0

시도해보십시오. 나는 당신이 벡터를 플레이어에게 알기 때문에 깨달았습니다. 당신은 삼각 관계가 필요 없습니다. v와 h를 한 번만 계산하면됩니다. 따라서 값을 저장하고 모든 프레임에서 계산하지 않아도됩니다.

// Vector from enemy to player 
CGPoint v = enemy.position - player.position; 

// distance from enemy to player (sqrt of the dot product of v with v) 
float h = sqrt(v.x*v.x+v.y*v.y); 

// Desired distance to move along v 
delta = ((screenSize.width/kLaserSpeed)* dtSixty); 

// delta/h is the % moved along v, find the % moved in the x and y direction 
xDiff = v.x * delta/h; 
yDiff = v.y * delta/h; 
관련 문제