私は(あるべきである)取り組むべき単純な問題を抱えており、それを解決する他の方法を受け入れています。私は他の解決策を受け入れています。
問題:Javaスイングを使用して、ターンベースのタイルベースのゲームのグラフィックを表示しています。絶対に配置されたアイコン付きのjlabelを使用しています。
動きをアニメートするために、一度に4ピクセルずつ位置を更新するスイングタイマーを使用して、スプライトをゆっくりと右、左などに動かしています。
これを最初に達成するために、私はタイマーを実行していました。これは素晴らしい働きをします。下に移動してから右に移動しようとすると、問題が発生します。
スプライトは下に移動し、右に移動することはありません。コンソール印刷で実行を見ると、両方のタイマーが同時に実行されていることがわかります。私はインターネットでかなりの量の掘り下げを行いましたが、最初のタイマーが停止するまでスイングタイマーを実行しないように指示する方法を見つけることができませんでした。ビジーウェイトをしようとすると、1つのタイマーが終了するまで待ちます(うん)UIがまったく表示されない(明らかに間違った方向へのステップ)。
これで、タイマーから完全に離れて、スプライトを新しい場所にテレポートするか、ひどいビジーウェイト移動スキームを使用することができますが、ある種の魂が解決策を持っていることを望んでいます。
つまり、スイングタイマーを一定時間実行し、停止してから、新しいタイマーを開始して、オーバーラップしないようにする方法が必要です。できれば、このメソッドを使用すると、各タイマーを独自のメソッドに含めることができ、メソッドを次々に呼び出すことができます。
あなたが持っているかもしれないどんなアドバイスにも前もって感謝します。
編集:拡張されたサンプルコード。完全なscsseがアドバイスの要件である場合、完全なコードは獣であるため、時間を無駄にして申し訳ありません。このサンプルコードは、現状ではまったく機能しません。申し訳ありませんが、要点を説明する必要があります。
それで。2つの機能があり、それぞれにアニメーションサイクルを実行するタイマーがあり、1つは下と右斜めに移動するためのもので、もう1つは真下に移動するためのものです。
public class TestClass {
static int counter = 0;
static int counter2 = 0;
static Timer timerC;
static Timer timerX;
public static void main(String[] args) {
moveC();
moveX();
}
public static void moveC() {
int delay = 200; // milliseconds
timerC = new Timer(delay, null);
timerC.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (counter < 32) {
counter = counter + 4;
System.out.println("*C*");
} else {
timerC.stop();
System.out.println("*C STOP*");
}
}
});
timerC.start();
}
public static void moveX() {
int delay = 200; // milliseconds
timerX = new Timer(delay, null);
timerX.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
if (counter < 32) {
counter = counter + 4;
System.out.println("*X*");
} else {
timerX.stop();
System.out.println("*X STOP*");
}
}
});
timerX.start();
}
}
私がここで見たいと思うのは、最終的には
*C*
*C*
*C*
*C*
*C STOP*
*X*
*X*
*X*
*X*
*X STOP*
私が実際に得るのは
*C*
*X*
*C*
*X*
*C*
*X*
*C*
*X*
*C STOP*
*X STOP*
ここで取得しようとしているポイントは、1つのアニメーションサイクルを実行して完了し、次にもう1つのアニメーションサイクルを実行することです。
再度、感謝します。