4

Java ウィンドウで電車を動かそうとしていますが、深刻な問題が発生しています。電車を作ったTrainクラスと、電車を動かすことになっているDriverクラスがあります。画面の左端を「通過」するまで、列車全体を右から左に移動させる必要があります。次に、if ステートメントを追加して dx を変更し、列車が右側で再始動するようにします。以下は私が試したものですが、うまくいきません。誰でも私を助けてもらえますか??

public class Driver extends GraphicsProgram
{
    //~ Instance/static variables .............................................

    private static final int N_STEPS = 1000;
    private static final int PAUSE_TIME = 20;
    private static final double TRAIN_LENGTH = 320;

    //~ Constructor ...........................................................

    // ----------------------------------------------------------
    /**
     * The run() method of the Driver Class.
     * Creates an instance of the Train Class.
     * Responsible for animating the train across the screen.
     */
    public void run()
    {
        Train train = new Train(getGCanvas());
        for (int i = 0; i < N_STEPS; i++) {
            train.move(-100, 0);
            pause(PAUSE_TIME);
    }
4

2 に答える 2

3

これは、swing で作成された小さなデモです。黒い四角形を列車の画像に置き換えるだけで完了です。

トリックは、別のスレッド (またはタイマー) を使用してアニメーション ループ (しばしば と呼ばれます) を実行することgame loopです。ループは、ウィンドウ自体を再描画するように指示するだけで、再描画のたびに、最初にアニメーション化されたオブジェクトの新しい位置を計算してから、それらを描画します。

import javax.swing.*;
import java.awt.*;

public class TrainDemo {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Train Demo");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(800, 400);
        frame.setLocationRelativeTo(null);
        frame.add(new TrainCanvas());
        frame.setVisible(true);
    }

}

class TrainCanvas extends JComponent {

    private int lastX = 0;

    public TrainCanvas() {
        Thread animationThread = new Thread(new Runnable() {
            public void run() {
                while (true) {
                    repaint();
                    try {Thread.sleep(10);} catch (Exception ex) {}
                }
            }
        });

        animationThread.start();
    }

    public void paintComponent(Graphics g) {
        Graphics2D gg = (Graphics2D) g;

        int w = getWidth();
        int h = getHeight();

        int trainW = 100;
        int trainH = 10;
        int trainSpeed = 3;

        int x = lastX + trainSpeed;

        if (x > w + trainW) {
            x = -trainW;
        }

        gg.setColor(Color.BLACK);
        gg.fillRect(x, h/2 + trainH, trainW, trainH);

        lastX = x;
    }

}
于 2013-10-28T09:02:44.707 に答える