2012-04-15 2 views
2

"자전거"목록의 한 객체에 부울 isBoosting이 포함되어 있으면 drawLine()을 더 빨리 수행하려고합니다. 목록에 두 개의 자전거가 포함되어 있고 그 결과 자전거 중 하나만 isBoosting 할 때 두 가지 자전거의 속도가 빨라지는 것으로 나타납니다. 왜 누군가는 아이디어를 가지고 있습니까? 객체가 isBoosting에 대해 true 값을 포함하지 않으면 스레드가 "이동"하지 않아야합니까?다른 Thread.sleep() 기간을 사용하여 플레이어 속도를 제어 하시겠습니까?

foreach (LightBike b in bikes) //draw bikes 
{ 

    if (b.isBoosting && b.boostCounter > 0) //player is boosting 
    { 
     Thread.Sleep(GAME_SPEED - 5); 
     b.boostCounter--; 
     if (b.boostCounter == 0) 
     { 
      b.isBoosting = false; 
      b.boostCounter = 20; 
     } 
    } 
    else 
    { 
     Thread.Sleep(GAME_SPEED); 
    } 

    canvas.DrawLine(new Pen(b.color, BIKE_SIZE) { EndCap = System.Drawing.Drawing2D.LineCap.Square }, b.location, b.getNextLocation()); 

} 
+1

*이 접근법은 안정적으로 작동하지 않습니다. * 지연을 제어하지 마십시오. 근사치 일 뿐이며 다른 요인에 의해 영향을받을 수 있으며 모든 것에 영향을 줄 수 있습니다. * 각 시간 delta * (정확히 일정하지 않고 시간 델타가 올바르게 처리되면 변경 될 수 있음)마다 이동 한 양을 제어하십시오. 이 "시간 델타 이동"의 간단한 형태는 [좋은] 기본 게임 튜토리얼에서 다룹니다. –

+1

또한 업데이트 논리는 그리기 논리와 분리되어 있어야합니다. 그리기는 세계의 개체를 시각적으로 표현한 것으로 대부분의 경우 독립적이어야합니다. –

답변

5

여기에는 몇 가지 문제가 있습니다.

첫 번째로, 하나의 스레드이기 때문에 일정 기간 동안 잠자기하면 스레드가 일정을 잡아 내지 않습니다. 렌더링이 수행되지 않습니다 (어떤 경우에는 "강화 된"자전거 나 다른 자전거도 그려지지 않습니다). 실제로 그려지는 선은 항상 b.location에서 b.getNextLocation()으로 이동합니다. b.getNextLocation()은 부스트 ​​된 자전거와 부스트되지 않은 자전거에 모두 동일합니다.

둘째, 당신은

정말 당신은 렌더링에서 그 유지, 모델의 일종으로 자전거를 구현하고 모델과 렌더링에 자전거 속도를 구별해야 ... 렌더링 코드와 로직을 혼합하고 암호.

모델에는 자전거마다 속도 벡터가 포함되는 것이 이상적입니다 (렌더링주기와는 별도로 티크 카운트의 가속 벡터로 수정 됨). 모든 렌더링은 해당 라인을 그립니다.

기본적으로 부스트 - 코드를 Draw()가 아닌 b.getNextLocation()에 넣고 드로잉 코드에서 조건문을 제거하십시오.

0

두 개의 자전거 A와 B가 있다고 가정합니다 (부스팅하지 않음). 의 사이클의 몇 가지를 통해 가자 : B = GAME_SPEED * 2의 다시 그리기 사이 A = 시간을 다시 그리기 사이

A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED 
Redraw B 
A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED 
Redraw B 

시간. 당신이 관찰하고하는 일이 왜 5

이 당신을 보여줍니다 - =이 * 2 GAME_SPEED

A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED - 5 
Redraw B 
A -- wait GAME_SPEED 
Redraw A 
B -- wait GAME_SPEED - 5 
Redraw B 

시간 B = 시간의 다시 그리기 사이에 (A)의 다시 그리기 사이 :

이제 B가 증폭되는 가정 : 각 자전거는 자신의 것이 아니라 모든 사람의 지체를 기다립니다.

유일한 방법은 하나의 "화면 새로 고침"지연을 가지며 시간 지연이 아닌 객체가 이동하는 거리를 변경하여 속도를 제어하는 ​​것입니다.

관련 문제