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

/*
<applet height=800 width=600 code="RaceApplet.java"></applet>
*/

public class RaceApplet extends JApplet implements KeyListener
{
    private Image player;
    private Image bg;
    private int nx = 800;
    private int ny = 0;
    private Rectangle rect;

    private void loadPicture()
    {
        bg = new ImageIcon("RaceBack.png").getImage();
        player = new ImageIcon("KD//KDE.png").getImage();
    }

    public void init()
    {
        loadPicture();
        rect = new Rectangle(250, 93, 50, 50);
        this.addKeyListener(this);
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        g.setColor(Color.green);
        g.fillRect(0, 0, 34567, 34567);
        g.drawImage(bg, nx - 800, ny, null);
        g.drawImage(player, rect.x, rect.y, null);

    }

    public void keyPressed(KeyEvent e)
    {
        if( e.getKeyCode() == KeyEvent.VK_RIGHT )
        {
            nx = nx - 20;
            player = new ImageIcon("KD//KDE.png").getImage();
        }
        if( e.getKeyCode() == KeyEvent.VK_LEFT )
        {
            nx = nx + 20;
            player = new ImageIcon("KD//KDW.png").getImage();
        }
        if( e.getKeyCode() == KeyEvent.VK_UP )
        {
            ny = ny + 20;
            player = new ImageIcon("KD//KDN.png").getImage();
        }
        if( e.getKeyCode() == KeyEvent.VK_DOWN )
        {
            ny = ny - 20;
            player = new ImageIcon("KD//KDS.png").getImage();
        }

        repaint();
    }

    public void keyReleased(KeyEvent e)
    {

    }

    public void keyTyped(KeyEvent e)
    {

    }

}

問題は、アプレット画面で車を動かすと画面がちらつくことです。これに対する解決策はありますか。ちらつきのない画面にするにはどうすればよいですか。私はほとんどのサイトを検索しましたが、彼らが示した方法はあまり機能しませんでした

事前に助けを求めるthnx

4

2 に答える 2

5

イメージが必要になるたびにインスタンス化するのではなく、最初にすべてのイメージをロードする必要があります。

于 2013-07-10T10:36:37.830 に答える
1

に画像をロードしているという事実とは別に、Swing の最適化されたダブル バッファリング ペイント メカニズムを利用しないKeyEventsオーバーライドを行っています。ちらつきを引き起こすのではなく、paintオーバーライドします。paintpaintComponent

ペイント機能を新しいクラスのサブクラス化に移動し、呼び出すことを忘れないようにJComponentオーバーライドしますpaintComponentpaintsuper.paintComponent(g)

public class ImageComponent extends JComponent {

    private Image player;
    private Image backgroundImage; // formerly bg
    private int nx = 800;
    private int ny = 0;
    private Rectangle rect;

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.setColor(Color.green);
        g.fillRect(0, 0, 34567, 34567);
        g.drawImage(backgroundImage, nx - 800, ny, null);
        g.drawImage(player, rect.x, rect.y, null);

    }

    public void setPlayer(Image player) {
        this.player = player;
    }

    public void setBackgroundImage(Image backgroundImage) {
        this.backgroundImage = backgroundImage;
    }
}

関連はありませんが、との相互作用を処理する KeyListeners ではなくKey Bindingsの使用を検討してくださいKeyStrokes

于 2013-07-10T10:42:09.423 に答える