2011-10-18 7 views
1

私の2Dゲームでは、動きの速さは様々ですね。私は自分のデスクトップでゲームを作っていましたが、うまく走っていましたが、私はラップトップを使い、Playerはデスクトップを遅く動かしました。ここで移動速度はさまざまですか?

は私の現在のゲームループである:ここで

public void gameLoop() throws IOException { 

    isRunning = true; 


    while(isRunning == true) { 

     Graphics2D g2d = (Graphics2D) strategy.getDrawGraphics(); 
     //main game loop 
     //updates everything and draws 
     //main componenets 
     //e.g. Player 
     // clear the screen 
     g2d.setColor(Color.lightGray); 
     g2d.fillRect(0,0,640,496); 

     //drawing 
     player.paint(g2d);//paint player 
     map.paint(g2d);//paint each wall in wall list 

     g2d.dispose(); 
     strategy.show(); 

     //update 
     try { player.updateMovement(); } catch (Exception e) {}; 

     try { Thread.sleep(4); } catch (Exception e) {}; 


    } 
} 

は私player.updateMovementある()メソッド:

public void updateMovement() { 

    if(!down || !up) { 
     ny = 0; 
    } 

    if(!left || !right) { 
     nx = 0; 
    } 

    if(left) { 
     nx = -1; 
    } 

    if(right) { 
     nx = 1; 
    } 

    if(up) { 
     ny = -1; 
    } 

    if(down) { 
     ny = 1; 
    } 



if ((nx != 0) || (ny != 0)) { 
    x += nx; 
    y += ny; 
    } 
} 

私はこの問題をどのように修正することができますか?

ありがとうございました。

答えて

1

固定レートの描画ループを使用することができます。すべての反復は同じにする必要があります。残り時間がある場合は、その時間をスリープします。たとえば、41.6 ms(24 fps)の期間を固定し、一定の反復が20 ms続く場合、41.6 - 20 = 21.6 msが経過するとスリープする必要があります。

ローエンドのPCでコードを実行するには重すぎる場合は、すべてのマシンが対応できるように期間を増やすことができます。

ところで、コードを最適化することもできます。

詳細については、gaming.stackexange.com

+0

を参照してください。ありがとう、私は最適化できる部分を指摘できますか? –

+0

繰り返しの間に変更されないものはすべて、whileループの外側に置くことができます。例えば、オブジェクトの作成は「高価」です。私は新しいインスタンスを作成するのではなく、その間に 'Graphics2D'を作成し、それをクリアしてループ内で更新することを考えています。例外をスローしないように 'player.updateMovement()'メソッドを変更して、try-catchを取り除くこともできます。一般に、新しいオブジェクトを作成することは避けてください(代わりに再利用してください)、ラッパーの代わりにプリミティブを使用してください(Integerよりも優れています)。 –

+0

私はそれを少しきれいにしたと信じています。 –

関連する問題