0

Java でゲームを作成するのは初めてですが、現在の設定では、ペイント メソッドの FPS はシステムによってのみ制限されます。そのため、私の FPS は 300 から 450 の間になる傾向があります。オブジェクトの移動速度を標準化するために、増分を FPS で割って、1 秒の時間枠でその合計量を増分するようにしました。

次のコードがあります。私がやりたいことmap.addEntity()は、FPSに従って、毎秒300回または400回呼び出されないようにします。代わりに、たとえば発射体を 10 RPS 程度で発射するように選択できるようにします。どうすればこれを達成できますか?

public void mousePressed(MouseEvent e) {
     if (gameStarted)
        shootProjectile = true;
  }
public void paint(Graphics g) {
if (shootProjectile)
           map.addEntity(new Projectile("projectile.png", x, y, 0, projectileSpeed));
}
4

2 に答える 2

2

増分をFPSで割っています

そうしないでください!Timerまたはを使用して、swingTimerすべてを一定の速度で更新します。たとえば、次のようなことができます。

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

public class Test {   
    public static void main(String[] args) throws InterruptedException {
        Timer timer = new Timer(10,new ActionListener(){

            @Override
            public void actionPerformed(ActionEvent e) {
                updateProjectilePositions();
            }

        });
        timer.start(); 
    }

    private static void updateProjectilePositions() {
        // TODO Auto-generated method stub
    }
}

Timerスイングを使用する場合、発射物の更新はスイングスレッドで行われることに注意してください。更新がハングすると、GUIもハングします。

また、1つのことと1つのことだけを行うので、map.addEntity内部に電話するべきではありません。すべてをペイントすることです。これを回避することはできますが、位置などを更新するコードと、オブジェクトをレンダリングするコードを混同すると、最終的にはあなたに噛み付くでしょう。paint()paint()

于 2013-01-20T05:32:23.247 に答える
2

量子化器としてFPSを使用しないでください。使用すると、フレームのドロップやスパイクに応じて、ゲームが異なるマシンで、さらには同じマシンでも異なる速度で実行されます。

あなたは2つの異なることをすることができます:

  • 各フレームの更新の間にデルタ時間を使用し、ゲームロジックを比例的に更新します
  • 時間デルタを追加し、固定量ごとにロ​​ジック更新を実行するアキュムレータを使用します(ロジック更新が修正されるため、比例して処理を行う必要はありません)。
于 2013-01-20T05:34:48.120 に答える