0

3年ぶりに(基本的な)アニメーションJAppletを作成できたのですが、動くと画像がちらつくのが気になります。Timer オブジェクトは画像を動かすものであり、私のプライベートな内部クラス「TimerListener」は動画のアニメーション モーションを担当します。

これが私の TimerListener クラスのコードです。この問題は解決できると思います。

@Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(smileyFace.getImage(), xCoord, yCoord, this);
    }

    private class TimerListener implements ActionListener {

        @Override
        public void actionPerformed(ActionEvent e) {

            //Following if-else manipulates Y coordinate
            if (goingUp) {
                if (yCoord > minY) {
                    yCoord -= move;
                } 
                else {
                    goingUp = false;
                }
            } else {
                if (yCoord < (getContentPane().getHeight() - (smileyFace.getIconHeight()+ Y_OFFSET))) {
                    yCoord += move;
                } 
                else {
                    goingUp = true;
                }
            }

            //Following if-else manipulates X coordinate
            if (goingSideways) {
                if (xCoord > 0) {
                    xCoord -= move;
                } 
                else {
                    goingSideways = false;
                }
            } else {
                if (xCoord < (getContentPane().getWidth() - (smileyFace.getIconWidth() + X_OFFSET))) {
                    xCoord += move;
                } 
                else {
                    goingSideways = true;
                }
            }

            repaint();
        }
    }

それが役立つ場合は、これが私の JApplet のスクリーンショットです。この場合、トロールの顔は黒い領域で移動し、側面に当たると跳ね返ります。

ここに画像の説明を入力

JApplet を実行してテストしたい場合は、https: //github.com/rattfieldnz/Java_Projects/tree/master/JAppletAnimation から Netbeans プロジェクトを入手できます。

4

1 に答える 1

1

ユーザー「arynaq」のおかげで、問題が解決しました。次のペイント方法を入れます:

@Override
    public void paint(Graphics g) {
        super.paint(g);
        g.drawImage(smileyFace.getImage(), xCoord, yCoord, this);
    }

...JPanel を拡張する内部クラスに変換します (「paint」を「paintComponent」に変更したことに注目してください):

class ImagePanel extends JPanel
    {

        public ImagePanel()
        {
            setBackground(Color.BLACK);
        }

        @Override
        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(smileyFace.getImage(), xCoord, yCoord, this);
        }

        @Override
        public void setBackground(Color bg) {
            super.setBackground(bg); //To change body of generated methods, choose Tools | Templates.
        }


    }

...次に、それを init() メソッドを介して JApplet に追加しました (これを JApplet のコンストラクターと呼んで正しいかどうかはわかりません...):

@Override
public void init() {

    smileyFace = new ImageIcon("images/happyFace.png");
    **add(new ImagePanel());**
    timerDelay = 10;
    timer = new Timer(timerDelay, new TimerListener());
    timer.start();

    //getContentPane().setBounds(0, 0, CONTENTPANE_WIDTH, CONTENTPANE_HEIGHT);
    getContentPane().setBackground(Color.BLACK);

    //maxY = getContentPane().getHeight();
    minY = 0;

    xCoord = 0;
    yCoord = 0;
    move = 2;

}

私の GitHub JApplet プロジェクトを複製して NetBeans で実行すると、実行されていることがわかります:)。

于 2013-06-07T13:11:59.110 に答える