前提・実現したいこと
現在marioAIを使って勉強していて、その中で穴に落ちそうになったら壁キックをするようなエージェントをつくりたい。
発生している問題・エラーメッセージ
TimerTask内の1つめの処理しか実行されず、次の処理にうまく移ってくれない
該当のソースコード
Java
1if(action[Mario.KEY_RIGHT] && isOnTheRightWall(r, c)) { 2 Timer timer1 = new Timer(), 3 timer2 = new Timer(), 4 timer3 = new Timer(), 5 timer4 = new Timer(); 6 action[Mario.KEY_JUMP] = false; 7 timer1.schedule(new TimerTask() { 8 public void run() { 9 action[Mario.KEY_JUMP] = isMarioAbleToJump; 10 } 11 }, 50); 12 timer1.cancel(); 13 timer1 = null; 14 timer2.schedule(new TimerTask() { 15 public void run() { 16 action[Mario.KEY_RIGHT] = !action[Mario.KEY_RIGHT]; 17 } 18 }, 51); 19 timer2.cancel(); 20 timer2 = null; 21 timer3.schedule(new TimerTask() { 22 public void run() { 23 action[Mario.KEY_LEFT] = !action[Mario.KEY_LEFT]; 24 } 25 }, 52); 26 timer3.cancel(); 27 timer3 = null; 28 timer4.schedule(new TimerTask() { 29 public void run() { 30 action[Mario.KEY_JUMP] = isMarioAbleToJump || !isMarioOnGround; 31 } 32 }, 53); 33 timer4.cancel(); 34 timer4 = null; 35 }
試したこと
上に示したコードではtask1つ1つにtimerを用意していますが、もともとは4つのtaskを1つにまとめて、timerも1つにして実装していましたが、挙動は現在のコードと変わりませんでした。taskやtimerについては宣言する場所を変えてみたり、cancel()の位置を変えてみたりもしました。また、Thread.sleep()も使ってみましたが、marioAIの実行自体が止まってしまいました。
補足情報(FW/ツールのバージョンなど)
上のコードを実際に試してみたところ、壁にぶつかりそうになるとジャンプキーが無効になった後、ちょっとしてから有効になって、壁をけった後は1度無効になって再度有効になります。ほかのキーに関しては、右・左キーともに変化しませんでした。
そもそもなぜこのように遅延を設けているのかということですが、地形情報の取得が画面内の規定のグリッド単位でしか行えないため、(今回であれば)右側の壁にマリオが接しているという状態は、実際に壁に衝突するより少し前にしか判断できないので、壁にちゃんと接してからジャンプキーを有効にしたいことが理由です。
また、壁キックですが、接している壁の側の方向キー及びダッシュ(のための)キーを有効にすることで可能となり、壁キックが可能であることはisMarioAbleToJumpを使うことで検出できます。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/29 11:00
2018/10/29 11:11
2018/10/29 12:25