独自のプリミティブ 2D グラフィック ベースのゲーム エンジンを作成しようとしています。ゲームのコア コンポーネントは、敵にさまざまな発射物を発射することです。作業を続ける前に、このコンポーネントを動作させる必要があります。
私が今持っているものは、開始点(x、y)とターゲット点(x1、x2)を通る線に沿って発射体を動かします。線形関数を利用しますy = mx + b
。問題は、発射体の位置をどのように更新するかによって、線の傾きに応じて一貫性のない速度が発生することです。(傾斜が大きいほど、より速く離れていきます)。
私が実行しているゲームループのコア構造は次のとおりです。
private void executeGameLoop()
{
long nextFrameStart = System.nanoTime();
while(panel.getRunning())
{
do
{
panel.update();
nextFrameStart += FRAME_PERIOD;
} while(nextFrameStart < System.nanoTime());
long remaining = nextFrameStart - System.nanoTime();
panel.repaint();
if (remaining > 0)
{
try
{
Thread.sleep(remaining / 1000000);
}
catch(Throwable e)
{
System.out.println(e.getMessage());
}
}
}
}
これは、構造とグラフィックを更新するための単なるメカニズムです。これが呼び出されるたびpanel.update
に、特定の状況下で発射体の位置が更新されます。発射物を更新するメソッドは次のとおりです。
これは、発射物にターゲットがあることを伝え、ラインに関する情報を設定します。
public void setHasTarget(boolean hasTargetIn)
{
if(hasTargetIn)
{
deltaX = getTargetX() - getX();
deltaY = getTargetY() - getY();
slope = deltaY / deltaX;
intercept = getY();
System.out.println("y = " + slope + "x + " + intercept); //line the projectile will follow
}
hasTarget = hasTargetIn;
}
この next メソッドは、ラインの次のステップに位置を設定します。(X は速度によって更新され、y は x に依存して更新されます)
public void setNext()
{
float temp = (slope) * (getX() + velocity) + intercept;
System.out.println("Slope: " + (slope) * (getX() + velocity));
System.out.println("Current: (" + getX() + ", " + getY() + ")");
System.out.println("Next: (" + (getX() + velocity) + ", " + (getY() + temp) + ")");
setX(getX() + velocity);
setY(temp);
}
この最後のメソッドsetNext()
が呼び出され、メイン ループによって呼び出されます。
public void update()
{
if(hasTarget)
setNext();
}
私が言ったように、私の現在のコードを考えると、実行すると、線の傾きに応じて一貫性のない速度で画面上を移動する発射物が得られます。発射体が画面上を一定の速度で移動するように、コードを変更できるようにしたいと考えています。よろしくお願いします。