2012-03-19 4 views
1

소행성 게임에서 인공 지능을 만들려고했지만 멈추었습니다. 게임의 다른 모든 것들이 설정됩니다 (즉, 소행성이 생성되어 임의 방향으로 가면서 충돌 탐지, 우주선 및 총알이 생성됩니다). 인공 지능은 매 150ms마다 반복되며 우주선에게 좌회전, 우회전, 상향 이동 및 슛을 지시 할 수 있습니다 .2D 공간에서 물체가 충돌하는지 탐지합니다.

   // Convert points to positive 
       float asteroid_x = Math.Abs(asteroid.X); 
       float asteroid_y = Math.Abs(asteroid.Y); 

       float ship_x = Math.Abs(ship.X); 
       float ship_y = Math.Abs(ship.Y); 

       // Calculate difference in X and Y using positive values 
       float dx = asteroid_x - ship_x; 
       float dy = asteroid_y - ship_y; 

       // Get velocities of asteroid 
       float vx = asteroid.VX; 
       float vy = asteroid.VY; 

소행성이 배를 공격하려고하면 내가 계산해야 이러한 변수 (DX, DY, VX, VY)를 사용하여 : 여기

내가 지금까지 사용하고 내 코드의 조각이다 . 나는 삼각법을 사용하려고 노력해 왔지만 그렇지 않을 때 타격을 가할 것이라고 생각하고 있습니다. 그때는 칠 것 아닌지의 여부를 결정하기 위해 IF 문을 사용하려고했습니다

  float equation1a = (dy/vy) - (dx/vx); 
      float equation1 = ((dy/dx) - (vy/vx)); 

하지만 난 그것에 대해 이동하는 방법을 잘 모르겠어요 : 내가 사용하려고했습니다 방정식은 정확히. 이 IF 문 다음에 나는 AI로 들어가서 소행성을 돌리거나 쏘거나 피하려고한다.

도움 주셔서 감사합니다.

EDIT : 우주선이나 소행성의 X와 Y 값은 음수가 될 수 있으며, 우주선은 원점 (0,0)에서 시작합니다.

는 EDIT2 : 지금 모두와 함께 조금 더있어이 마련 :

// Determine if asteroid will collide 
int turns_ahead = 100; 
bool collision = false; 
int least_turns = 500; 
for (int i = 0; i < turns_ahead; i++) 
{ 
    PointF asteroid_pos_next = NextPosition(new PointF(asteroid.X, asteroid.Y), new PointF(asteroid.VX, asteroid.VY), i); 

    if (asteroid.CollidesWith(asteroid_pos_next.X, asteroid_pos_next.Y, ship.R)) 
    { 
     collision = true; 
    } 
} 

그리고 다음 위치가이 기능을 함께 일한다 :

// ----------------------------------------------------------------- 
    // Function to find position of object in X turns (turns_ahead) 
    // ----------------------------------------------------------------- 
    private static PointF NextPosition(PointF current_pos, PointF velocity, int turns_ahead) 
    { 
     float next_x_pos = current_pos.X + (velocity.X * turns_ahead); 

     float next_y_pos = current_pos.Y + (velocity.Y * turns_ahead); 

     // IFs to deal with screen wrap-around 
     if (next_x_pos < -Form1.maxX) 
     { 
      next_x_pos = Form1.maxX; 
      if (next_y_pos < 0) 
       next_y_pos += Form1.maxY; 
      else 
       next_y_pos -= Form1.maxY; 
     } 
     else if (next_x_pos > Form1.maxX) 
     { 
      next_x_pos = -Form1.maxX; 
      if (next_y_pos < 0) 
       next_y_pos += Form1.maxY; 
      else 
       next_y_pos -= Form1.maxY; 
     } 

     if (next_y_pos < -Form1.maxY) 
     { 
      next_y_pos = Form1.maxY; 
      if (next_x_pos < 0) 
       next_x_pos += Form1.maxX; 
      else 
       next_x_pos -= Form1.maxX; 
     } 
     else if (next_y_pos > Form1.maxY) 
     { 
      next_y_pos = -Form1.maxY; 
      if (next_x_pos < 0) 
       next_x_pos += Form1.maxX; 
      else 
       next_x_pos -= Form1.maxX; 
     } 

     PointF next_pos = new PointF(next_x_pos, next_y_pos); 

     return next_pos; 
    } 

collidesWith는 기능입니다 다른 곳에서 총알/함선이 소행성에 충돌했는지 탐지하기 위해 사용됩니다. 나는 마치 소행성이 X/Y 값을 감싸는 것처럼 maxX/maxY 값에 갇혀있는 것처럼 보이지만 내 다음 위치 기능이 올바른지 확신하지 못한다.

+0

이것은 AI와 전혀 관련이 없습니다 (전혀 아님). – ziggystar

+0

이것은 수업 프로젝트입니까? 방금 전에 비슷한 질문을 보았습니다. http://stackoverflow.com/questions/9773255/c-sharp-collision-test-of-a-ship-and-asteriod –

+0

AI 부품은 배가 밖으로 나가야 할 때 들어옵니다 길/촬영. 그리고 네, 그것은 수업 프로젝트의 일부입니다, 미안했을 것입니다. 내 강사가 우리에게 틀린 수식을 주었기 때문에 꽤 혼란 스러웠지만 지금은 작동하고있는 것처럼 보입니다 –

답변

0

다음을 고려하십시오. 언제든지 소행성과 우주선의 위치와 속도를 알 수 있습니다. 그런 다음, 시간 t (150ms의 간격)에서 소행성의 위치가

asteroid_x + asteroid.vx * t 
asteroid_y + asteroid.vy * t 

되며 선박의 위치는 그래서 당신은 단지에 (t 0에서 반복 할 수

ship_x + ship.vx * t 
ship_y + ship.vy * t 

될 것입니다 100), 언제든지 소행성과 우주선이 서로의 거리 (예 : 반경의 합) 내에 있는지, 즉 충돌을 의미하는지 확인하십시오.

p.s.거리가

sqrt((asteroid_x - ship_x)^2 + (astroid_y - ship_y)^2) 

에 의해 주어진다 나는 당신이 잘

+0

결국이 기본 개념을 사용했습니다. 감사합니다! –

0

여기에는 충분한 컨텍스트가 없으므로 더 많은 코드를 실제로 볼 필요가 있습니다. 필자가 진행하고있는 매우 높은 수준의 개념은 두 가지 단계입니다. 1. 소행성 객체를 (우주선을 움직이는 사용자/AI와는 다른 스레드에서) 움직이는 것, 2. 소행성의 위치를 ​​비교하는 것 모든 운동 (충돌 사건)에 대한 선박의 위치 (사건 처리자). 또한 - 당신은 '충돌 할 것'이라고 말합니다. 충돌이 발생하기 전에 충돌을 예측하려고합니까? 그렇다면 소행성과 우주선의 이전/가장 최근의 움직임을 고려하여 미래의 움직임을 '예측'해야합니다.

0

세 번째 시간입니다 3 개 차원에서 객체의 움직임을 상상으로 일반적으로 충돌 감지에 대한 자세한 내용을 제안한다; 이 선들이 3D 가까이에 충분히 가까워지면 결국 충돌 할 것입니다 (물체가 양쪽 원이라고 가정 할 때 반경의 합보다 작음).

이 두 3D 선은 점 (x, y, 0)과 방향 벡터 (vx, vy, 1)로 정의 할 수 있습니다. 잘 알려진 지오메트리를 적용하여 두 개의 "기울이기"3D 선 사이의 가장 가까운 거리를 찾을 수 있습니다. 나는 그것을 모른다. 그러나 here's an article는 다음과 같이 표현한다.

D = | c · (a × b) |/| a × b | 소문자 변수 벡터이다

는, (C)는 위치들 사이의 차이이고, B는 두 개의 방향 벡터이다.

개체가 현재의 현재 궤도에서 충돌 한 경우 false positive가 생성됩니다. 나는 그 문제를 해결하는 방법을 잘 모르지만, 비록 그것을 남겨 두었다 할지라도 아마도 AI에 많은 영향을 미치지 않을 것입니다. 아마도 "확실하게 분리"를 테스트 할 수있는 방법이있을 것입니다. 또는 아마도이 수식에서 분자의 부호가 의미가 있습니다.

관련 문제