0

私の KeyPressed は機能していますが、私の moveLeft メソッドから avatarDX に変更はありません。moveLeftで何か間違ったことをしましたか? シンプルなはずですが、何が間違っていたのかわかりません。エラーメッセージはありません。

キャンバスに画像を描いています

gc.drawImage(avatar, avatarSX, avatarSY, avatarSW, avatarSH, avatarDX, avatarDY, avatarDW, avatarDH);

KeyPressedの場合、私は持っています

canvas.setOnKeyPressed(new EventHandler<KeyEvent>() {
        @Override
        public void handle(KeyEvent ke) {
            double speed = 2;
            switch(ke.getCode()) {
                case A:
                    System.out.println("pressed a");
                    moveLeft(avatarDX, speed);
                    System.out.println(avatarDX);
                    break;
            }
        }
});

そしてmoveLeftは

private void moveLeft(double avatarDX, double speed) {
            while (avatarDX > 0) {
                avatarDX -= speed;
            }
        }

私はこれが非常に新しいので、助けていただければ幸いです。

4

1 に答える 1

1

プログラムが期待どおりに動作しない理由 (他にもあるかもしれません) は、アバターを制御するために while ループを介して処理しようとしているためです。

これは、ループが完了するまでJavaFXアプリケーションを一時停止し、ループの最後に画面を最終状態に更新します。JavaFX は即時描画システムではなく、JavaFX アプリケーションスレッドの制御を JavaFX システムに戻したときにのみシーンをレンダリングする保持描画システムです。

代わりに、コールバックを使用して各パルスでシーンを更新する必要があります。

次のアプローチを使用することをお勧めします。

  1. 初心者なので、Canvas ではなく JavaFX シーン グラフを使用してアプリケーションを作成してみてください。シーン グラフのプログラミングは、多くの点で単純に簡単です。後の段階で Canvas の方が適切であることがわかった場合は、JavaFX プログラミング モデルをよりよく理解した時点で、いつでも Canvas に変換できます。
  2. キーを押してシーン グラフ内でキャラクターを移動するこのサンプルを確認してください。
  3. ループしてキャラクターを動かそうとしないでください。代わりに、トランジションなどの組み込みの高レベル JavaFX アニメーション機能を使用するか、(ここでのケースのように、それらが適切でない場合)、低レベルのAnimationTimerインターフェイスを使用します。
  4. ゲームループと JavaFXについて読み、そこで学んだ知識をプログラムに適用してください。
于 2016-05-26T18:35:36.383 に答える