2017-10-18 12 views
1

小さなゲームでコンピュータと人間の間で交互に動きを切り替えるより良い方法を知りたい。 コンピュータは、コンピュータを再度、ボタンの一部をクリックすることで、人間劇よりも、最初果たし、再び人間などオルタナティブに切り替える動きでゲームを一時停止する

frame.computerPlaysRandom(); 
while(!frame.end) 
{ 
//if(frame.alreadyExecuted) 
// { 
frame.computerPlaysRandom(); 

// } 
// frame.computerPlaysRandom(); 
} 

私は humanPlays方法の終わりにalreadyExecutedブール変数を置くことを考えたが、それは仕事をdoesntの。

public void computerPlaysRandom() 
{ 
    ...... 
    if(activeColour == RED) 
    { 
    ..... 
    } 
    activeColour = YELLOW;  
} 

私はこのようにしていないと、人間とコンピュータの再生が全く同じように不自然に見えます。そしてそれは常にループしている別のものです。

私は説明するために最善を尽くしました、私はこれを行うためのよりよい方法の提案を与えてください。

+2

**ゲームモデル**は、プレイの内容を把握する必要があります。上記のように「ゲームループ」を作るのではなく(ループはイベントディスパッチスレッドをブロックする傾向があります)、代わりにゲームがGUIのイベントに反応するようにしてください。 –

答えて

3

@ Andrew Thompson commentsとして、「ゲームモデルは誰のプレイであるかを把握する必要があります。単純なMVCの例のゲームが調べられますhere。このより複雑なターンベースのgameでは、キーが押されると、プレイヤーは前進する敵から逃げるために移動します。 here見キーハンドラは、与えられたKeyでゲームモデルのmove()メソッドを呼び出します:

game.move(k.getMove()); 

ゲームモデルのmove()方法はプレイヤーの位置を更新し、それに応じて敵を移動します。その後、モデルはmoveBots()の呼び出しで更新イベントを発生させます。各リスニングビューは、新しいゲーム状態の一部をレンダリングします。たとえば、RCViewは新しいプレイヤー/敵の位置を描画し、他のビューはスコアとステータスの表示を更新します。

モデルのゲームロジックが複雑すぎると、event dispatch threadが遅くなることがあります。その場合は、SwingWorkerのバックグラウンドでモデルを実行してください。

+1

私は大胆にコミュニケーションしようとしていましたが、bucketfullsを使って詳細をバックアップし、実際のコードをバックアップしました。おかげでTG! –

+0

@trashgod MVCの提案に感謝します。とにかく、私は実際にはwhileループを持っていない、例えば両方のプレイヤーがロボットである場合、ループなしでゲームフローを実装する方法はありません。少なくとも1人のプレイヤーが人間である場合は、actionPerformedメソッド(プレーヤーがボタンを押した後)に従うことでコントロールできるので、私はそれを管理できますか? –

+1

ゲームは 'javax.swing.Timer'を使用してモデルへのシリアル呼び出しをペースします。マウスを使用してエフェクトを見るときにアニメーションをトグルするには 'A'を押してください – trashgod

関連する問題