2016-06-25 6 views
2

내 XNA 프로젝트에 대한 간단한 AI를 만들었습니다.XNA, Do-While 기본 문제

내 페니 다이오드가 오른쪽에서 왼쪽으로 이동해야합니다.

불행히도 내 코드는 내 첫 번째 및 두 번째 Do-While을 건너 뛰므로 내 적의 이동이 없습니다. < 5 초. 그래서 그는 지금 또 다른 문제, 그래서 ... + -1.X 위치 업데이트

while (i <= 1) 
    { 
     EnemyVelocity.X += 1f; 
     timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 
     usedTimeRight = timer; 
     i++; 
    } 

    if (usedTimeRight != 0) 
    { 
     do 
     { EnemyVelocity.X -= 1f; 
      timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 
     } while ((timer - usedTimeRight) >= 5); 
     usedTimeLeft = timer; 
     usedTimeRight = 0; 
    } 
    if (usedTimeLeft != 0) 
    { 
     do 
     { EnemyVelocity.X += 1f; 
      timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 
     } 
     while (timer - usedTimeLeft >= 5); 
     usedTimeRight = timer; 
     usedTimeLeft= 0; 
    } 

에서 ~~~~~~~~~~~

점프 - 내 적의 모든 왼쪽 이동 시간

timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 

while (i <= 1) 
    { 
     EnemyVelocity.X -= 1f; 
     timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 
     usedTimeRight = timer; 
     i++; 
    } 

    if (usedTimeRight != 0 && (timer - usedTimeRight <= 2)) 
    { 
     int x; 

     for (x = 0; x <= 3; x++) 
     { 
      EnemyVelocity.X = 1; 

     } 
     usedTimeLeft = timer; 
     usedTimeRight = 0; 
    } 
    if (usedTimeLeft != 0 && (timer - usedTimeLeft <= 2)) 
    { 
     int x; 

     for (x = 0; x <= 3; x++) 
     { 
      EnemyVelocity.X = - 1; 

     } 
     usedTimeRight = timer; 
     usedTimeLeft = 0; 
    } 

답변

0

문제는 사실입니다 초기 동안 루프를 반복 usedTimeRight = timer> 0이 당신의 주먹과 두 번째 문에서도이 거짓이 될 것인지 것을 의미하기 전에 while 루프가 종료되는 것을 빨리 너무 빨리 useTimeLeftuseTimeRight 때문에 항상 0이됩니다. 이렇게 변경해보십시오. 선언시 변수 Timer이 1과 같아야합니다. 예를 들어

: 비디오 게임 업데이트에 루프 루프 동안 높은 사용하는 초보자 운영자 추천 할

float timer = 1f; 

    while (i <= 1) 
      { 
       EnemyVelocity.X += 1f; 
       timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 
       usedTimeRight = timer; 
       i++; 
      } 


      if (usedTimeRight != 0) 
      { 
       do 
       { EnemyVelocity.X -= 1f; 
        timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 
       } while ((timer - usedTimeRight) >= 5); 
       usedTimeLeft = timer; 
       usedTimeRight = 0; 
      } 
      if (usedTimeLeft != 0) 
      { 
       do 
       { EnemyVelocity.X += 1f; 
        timer += (float)gameTime.ElapsedGameTime.TotalSeconds; 
       } 
       while (timer - usedTimeLeft >= 5); 
       usedTimeRight = timer; 
       usedTimeLeft= 0; 
      } 
+0

(그동안에 타이머를 넣어 피하기 위해 노력을)하지만 내 캐릭터가 지금 왼쪽으로 이동 ... (추가하는 방법 새로운 코드? ^^) '' – Suikoden

+0

나는 각 점에서 모든 값을 살펴봄으로써 코드를 생각할 필요가 있다고 생각한다. – Needham

0

만이 게임을 중지하거나 일반적으로 (당신에게 일을 예상하지 못한 결과를 줄 수있는 당신이 정말 필요로 할 때 이 질문 에서처럼 텔레포트하기) 처음에는 게임 내부 논리가 어떻게 작동 하는지를 이해하기가 어려웠 기 때문에.

적을 5 초 동안해야한다면, 원하는 액션을 시작할 때 gameTime.ElapsedGameTime.totalMilliseconds 변수를 저장하고 savedGameTime이 총 gametime보다 작은 지 여부를 확인하십시오. 당신이 원하는 시간을 뺀 것입니다.

오른쪽으로 가면 원수가 5 초 동안 왼쪽으로 이동하고 5 초 동안 오른쪽으로 이동하기를 원하십니까? 이를 위해이 과 같이 수행해야합니다 : 내 코드를 조금 변경했습니다

 float delayBetweenMoves = 5f; 
     float lastMoveTime = 0f; 
     bool isMovingLeft; 
     public void Update(GameTime gameTime) 
     { 
      Move(gameTime); 
      enemy.Position += (enemy.VelocityX * enemy.Speed); 
     } 
     private void Move(GameTime gameTime) 
     { 
      if(lastMoveTime < gameTime.TotalGameTime.TotalMiliseconds - TimeSpan.FromSeconds(delayBetweenMoves)) 
      { 
       lastMoveTime = gameTime.TotalGameTime.TotalMiliseconds; 
       if (isMovingLeft) 
       { 
        enemy.VelocityX = -1; 
        isMovingLeft = false; 
       } 
       else 
       { 
        enemy.VelocityX = +1; 
       } 
      } 
     } 
+0

나는 당신이 제안한 것과 거의 같은 방식으로 내 문제를 해결했다. 고맙습니다. Btw, while 루프를 빠져 나가는 것이 정말 힘들다는 것을 알았습니다.> 그래서 내 프로그램이 멈추었습니다. < – Suikoden

+0

blanket,'update' 내부의'while' 루프에 대한 절대 금지는 좋은 조언이 아닙니다. 거기에'while '을 사용하는 것을 피할 고유의 이유는 없습니다. 그가 원래 사용하는 방식에서'while '을 사용하지 말아야한다는 것이 사실입니다. 완전히 금지하는 것은 부두 프로그래밍을 가르치는 것입니다. –

+0

@ BradleyUffner 초보자가 비디오 게임에서 잠재적으로 무한 루프를 사용하지 않는다고 말하는 것은 끔찍한 제안이라고 생각합니다. 비디오 게임에서는 대부분 시간이 지남에 따라 일을해야하며 가능한 한 빨리 while 루프가 업데이트에 가장 적합한 상황은 거의 볼 수 없습니다. 그러나 나는 완전히 틀릴 수 있다는 것을 인정한다. 그래서 나를 기쁘게 할 수 있다면 기뻐할 것이다. ^^ –