2014-01-06 2 views
2

시간 이동을 통합 한 간단한 타일 기반 게임을 구현하고 있습니다. 운동 및 충돌 감지에 대한 책임시간 기반 이동 및 충돌 감지 문제

내 코드

private function onEnterFrame(event:Event):void 
{ 
    if (waiting && game.movingBreakers <= 0) 
     endLevel(); 

    var interval:int = getTimer() - oldTime; 
    oldTime += interval; 
    var totalBreakers:uint = breakers.length; 

    if (totalBreakers) 
    { 
     for each (var breaker:Breaker in breakers) 
     { 
      if (!breaker.moving) 
       continue; 

      switch (breaker.direction) 
      { 
       case TOP: 
        breaker.y -= SPEED * interval; 
       break; 

       case BOTTOM: 
        breaker.y += SPEED * interval; 
       break; 

       case LEFT: 
        breaker.x -= SPEED * interval; 
       break; 

       case RIGHT: 
        breaker.x += SPEED * interval; 
       break; 
      } 

      checkCollisions(breaker); 
     } 
    } 
} 

나는 최근에 직면 게임과 어떤 관련이없는 이유로, 내 컴퓨터에 무거운 CPU 부하가 있다고하는 문제입니다. 결과적으로 게임의 프레임은 나중에 업데이트되었지만 스프라이트 (분리기)는 시간을 기준으로 한 움직임으로 올바른 위치에있었습니다. 그러나 마지막 두 프레임 사이의 시간 차이가 더 크기 때문에 스프라이트가 다른 위치로 이동했기 때문에 일부 충돌이 실패했습니다. 따라서, 제 질문은 누군가가 시간 기반 운동에서 충돌 감지 문제를 해결할 수있는 방법입니까?

답변

1

델타 시간에 운동을 할 때이 시나리오를 해결할 수있는 몇 가지 좋은 방법이 있습니다.

1) 가장 일반적인 방법 중 하나는 "고정 시간 단계"를 수행하는 것입니다. 이는 본질적으로 영향을받는 개체의 update() (또는이 경우에는 movement())이 "시간 단계"가 경과 한 후에 만 ​​실행되도록 구현 한 것입니다. FIXED_STEP:int = 10에 대한 변수 상수가 있다고 가정 해 봅시다.이 값은 10ms를 나타냅니다. 델타 시간 (interval)이 10ms 이상 경과 한 경우 update() 번을 보내고 (경과 시간/FIXED_STEP) 몇 번이나 실행하고 나머지 시간은 다음 경과 시간 값에 추가됩니다.

예를 들어 델타 시간이 45ms이므로 update()을 4 번 실행하고 다음 델타 시간에 5를 더할 것입니다.

이렇게하면 충돌을 감지 할 수 있습니다. 여기에 나는 또한 꽤 잘 설명 생각 C#을 설명입니다 : 당신이 할 수있는 Fixed Time Step C# XNA

2) 또 다른 방법은 프레임 사이에 물체를 이동하고 이동 단계를 만들 거리를 분할하는 거리를 계산하는 것이다. 즉 - 점 A에서의 대상 (40x40 직사각형)은 점 B로 이동하고, 거리는 X 축에서 200px이고, 객체를 200/object.width (= 40) = 5만큼 이동하면 movement() 5 번, 오브젝트 폭 40px만큼 이동하십시오. 이것은 이동 영역을 커버 할 것이고 당신의 충돌은 그 움직임 업데이트 중 하나에서 발견 될 수 있습니다.

이 작업을 수행하는 다른 방법이 있지만 성능상의 이유로 좋지 않을 수 있습니다. 레이 캐스팅과 객체의 주어진 경로에서 교차점을 찾는 것은 매우 정확하지만 성능 집약적이며 배우고 구현하기 위해서는 약간의 파고가 필요할 것입니다.

나는 또한 일부는 후방에 update() 전에 원점에서 새 객체를 만들고 그 객체를 사용하여 탐지를 수행한다고 읽었습니다. 즉, 점 (0, 0)의 객체 A가 다음 프레임 이후 (200, 0)으로 이동하면 (0, 0)에서 (200 + object.width, 0 + object.height)까지 영역을 만들고 대신에 그 객체에 대한 충돌 테스트.

어쨌든 나는 이것이 도움이되기를 바랍니다. 행운을 빈다.

0

AS3에는 CollisionTestKit 라이브러리를 사용해야합니다.