2010-01-26 2 views
2

나는 분대가지도 주위를 움직이는 전략 게임을 가지고 놀고 있습니다. 각 턴마다 일정량의 이동이 분대에 배정되고, 분대에 목적지가있는 경우, 목적지에 도달 할 때까지 포인트가 차례대로 적용됩니다. 실제 거리는 스쿼드가 x 또는 y 방향으로 한 위치를 움직이는 경우 한 점을 사용하지만 대각선 방향으로 움직일 경우 약 1.4 점이 사용됩니다. 분대는 실제 위치를 플로트로 유지하고, 그 다음에는 맵에서 위치를 그릴 수 있도록 반올림됩니다.x, y 좌표의 경로를 따라 정확하게 단위 이동

경로는 분대를 터치하고 끝 위치로 드래그 한 다음 펜이나 손가락을 들어 올리면 설명됩니다. (나는 지금 아이폰에서 이것을하고 있지만 안드로이드/Qt/윈도우 모바일은 똑같이 작동 할 것입니다.) 포인터가 x를 움직이면 y 포인트가 기록되어 분대는 최종 목적지까지의 중간 목적지 목록을 얻습니다. 목적지가 균등하지는 않지만 포인터 움직임의 속도에 따라 멀리 떨어질 수 있습니다. 장애물이나 지형이이 게임에서 중요하기 때문에 경로를 따라가는 것이 중요합니다. 나는 Flight Control을 다시 만들려고하고 있지는 않지만 비슷한 정비사입니다.

는 여기에 내가 뭘했는지,하지만 그것은 단지 (의사) 너무 복잡 보인다 올바른 방향입니다 물론 단순화 된 것

getDestination() { 
- self.nextDestination = remove_from_array(destinations) 
- self.gradient = delta y to destination/delta x to destination 
- self.angle = atan(self.gradient) 
- self.cosAngle = cos(self.angle) 
- self.sinAngle = sin(self.angle) 
} 

move() { 
- get movement allocation for this turn 
- if self.nextDestination not valid 
- - getNextDestination() 
- while(nextDestination valid) && (movement allocation remains) { 
- - find xStep and yStep using movement allocation and sinAngle/cosAngle calculated for current self.nextDestination 
- - if current position + xStep crosses the destination 
- - - find x movement remaining after self.nextDestination reached 
- - - calculate remaining direct path movement allocation (xStep remaining/cosAngle) 
- - - make self.position equal to self.nextDestination 
- - else 
- - - apply xStep and yStep to current position 
- } 
- round squad's float coordinates to integer screen coordinates 
- draw squad image on map 
} 

가, 기호 같은 물건의 이동을 보장하기 위해 쥐게 될 필요가있다. trig을 사용하는 것이 가장 좋은 방법이라면 조회 테이블을 사용할 수도 있고 예전처럼 현대 장치에서 조회 테이블을 사용할 수도 있습니다.

더 좋은 방법에 대한 제안이 있으십니까?

  • 업데이트가 - 아이폰은 삼각 및 상기 한 바와 어쨌든 수레에 그립니다로 구현 위치와 트랙의 수만을 추적 제로 문제가 있습니다. Bresenham 방법이 더 효율적이고 trig가 더 정확합니다. 정수 Bresenham을 사용한다면 충돌/지형 감지에 도움이되는 위치 정확도를 조금 더 유지하기 위해 10 배를 곱하려고합니다.

답변

2

나는 Bresenham's line algorithm이 무엇을 필요로한다고 생각합니다. Wikipedia 기사는 시작하기 좋은 곳이며 어딘가에서 더 많은 샘플 코드를 찾을 수 있어야합니다.

여기 각도를 사용하여 위키 백과

function line(x0, x1, y0, y1) 
int deltax := x1 - x0 
int deltay := y1 - y0 
real error := 0 
real deltaerr := deltay/deltax // Assume deltax != 0 (line is not vertical), 
     // note that this division needs to be done in a way that preserves the fractional part 
int y := y0 
for x from x0 to x1 
    plot(x,y) 
    error := error + deltaerr 
    if abs(error) ≥ 0.5 then 
     y := y + 1 
     error := error - 1.0 
+0

감사합니다. –

1

에서 의사 코드의 카운터 생산적인 것, 좌표계 X-Y에서 계산을 유지하는 것이 더 간단 할 것이다.