2012-11-19 3 views
0

나는 하향식 슈팅 게임을하고 있으며, 적들은 아무렇지도 않게 돌아 다니 길 원합니다. 이 코드에서는 메인 클래스의 무작위 (rnd)를 포함한 모든 변수 (회전, 위치 등)가있는 Enemy 클래스가 있습니다.무작위 적의 이동 방향

내 문제는 적들이 화면의 오른쪽 상단에서 왼쪽 하단으로 계속 이동한다는 것입니다. 그래서 그들은 주위를 방황하지는 않지만 항상 어떤 방향을 취합니다. 왜 그런지 알고 싶습니다.

refresh += gameTime.ElapsedGameTime.TotalSeconds; 

if (refresh >= 3) 
{ 
    refresh -= 3; 
    int rndDirection = rnd.Next(4); 

    if (rndDirection == 1) vektor = new Vector2(0, -1); 
    if (rndDirection == 2) vektor = new Vector2(0, 1); 
    if (rndDirection == 3) vektor = new Vector2(1, 0); 
    if (rndDirection == 4) vektor = new Vector2(-1, 0); 

    foreach (Enemy enemy in enemies) 
    { 
     Vector2 rndDirVec = vektor; 
     enemy.directionX = enemy.position.X - rndDirVec.X; 
     enemy.directionY = enemy.position.Y + rndDirVec.Y; 
     enemy.rotation = (float)Math.Atan2(enemy.directionY, enemy.directionX); 
    } 
} 
foreach (Enemy enemy in enemies) 
    { 
     enemy.position -= new Vector2((float)(enemy.speed/2 * Math.Cos(enemy.rotation)), (float)(enemy.speed/2 * Math.Sin(enemy.rotation))); 
    } 

나는 내가 거기에 어떻게 가지 기능에 대한 지식이 부족 수있는 C#에 비교적 새로운 해요, 그래서 누군가는 아마도 올바른 방향으로 날 지점 수 있을까?

+0

어디에서 rnd를 선언합니까? 메인 클래스의 – Jay

+0

, 나의 나쁜 점은 그 덧붙인 것을 잊어 버렸다. – Renet

답변

4

Random.Next의 정수 인수가 독점 상한, 0, 1, 2, 3. 당신은 X 좌표 증가하지, 그래서 원수는 항상 왼쪽으로 갈 것 때문에 rndDirection이 될 것입니다.

나는 이런 식으로 뭔가 (내가 XNA를 사용하지, 내가 코드의 세부 사항을 모르는, 그래서이 100 % 정확 확실하지 않다) 할 것 :

foreach (Enemy enemy in enemies) 
{ 
    enemy.direction.X = rnd.Next(3) - 1; // -1, 0, +1 
    enemy.direction.Y = rnd.Next(3) - 1; // -1, 0, +1 
    Vector2 movement = Vector2.Multiply(enemy.direction, enemy.speed); 
    enemy.position = Vector2.Add(enemy.position, movement); 
} 

또는를, 당신은 미세한 방향 변경을 원하는 경우 :

const float rotationStep = 5.0f * Math.PI/180.0f; // 5 degrees 
foreach (Enemy enemy in enemies) 
{ 
    enemy.rotation += (rnd.Next(3) - 1) * rotationStep; 
    enemy.direction.X = Math.Cos(enemy.rotation); 
    enemy.direction.Y = Math.Sin(enemy.rotation); 
    Vector2 movement = Vector2.Multiply(enemy.direction, enemy.speed); 
    enemy.position = Vector2.Add(enemy.position, movement); 
} 
+1

그래,'(rndDirection == 1,2,3,4)'을'0,1,2,3'으로 바꾼다. 너는 좋다. – Ragnagord

1

rand.next에 대한 인수는 항상 함께 이동하는 원수의 모든하려는 경우가 아니면 또한 내가 원수에 대한 foreach 루프 내부의 임의의 벡터를 다시 계산 것, 상한입니다 그래서 그들은 각각 모두 같은 무작위 운동 (unle ss thats 당신이 원하는 것).

+0

고마워, 실제로이 문제가 발생하여 귀하의 제안으로 해결했습니다! – Renet