2016-06-25 7 views
2

私のXNAプロジェクト用の単純なAIを作成しています。XNA、Do-While基本的な問題

私の敵は短いペリオードの後に​​右から左に移動する必要があります。

残念ながら、私のコードは私の第1と第2の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

問題は事実であるという最初のwhileループが繰り返さusedTimeRight = timer> 0これはあなたの拳と第二たstatmentsが偽になる場合ということを意味する前にwhileループが終了していることを速くとても速くuseTimeLeftuseTimeRight理由常に0になります。これを変更してみてください宣言時にTimer変数が1に等しいことを示します。例えば

:ビデオゲームのアップデートでループがループしながら、私は非常に使用するには、初心者にrecommandう

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

だけそれはあなたのゲームを停止したり、一般的に(あなたの事を予期しない結果を与えることができるよう、あなたは本当に、それを必要とするときこの疑問のようにテレポートします)。なぜなら、最初にゲームの内部ロジックがどのように動作するのかを理解することが困難なためです。

敵に何かをさせる必要がある場合は、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

ブランケットは、 'update'内の' while'ループを絶対に禁止するのは良いアドバイスではありません。そこに 'while 'を使わないようにする本来の理由はありません。あなたが当初それを使っていたやり方で 'while'を使うべきではないことは事実です。完全に禁止するだけで、Voodooプログラミングを教えるだけです。 –

+0

@BradleyUffner初心者がビデオゲームで潜在的に無限ループを決して使用しないと言うのは恐ろしいことだと思います。ビデオゲームでは、時間の経過とともにほとんどのことを行う必要があります。できるだけ早く、whileループがアップデートに最適な状況はほとんどありません。しかし私は完全に間違っていることを認めているので、私にこのことを教えてもらえれば嬉しいでしょう。^^ –