Как перестать мерцать в этом коде

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)
    {

    }

}

Проблема в том, что когда я двигаю машину на экране апплета, она мерцает. Есть ли решение для этого. Как я могу сделать это без мерцания экрана. Я искал на большинстве сайтов, но, как они показали, это не сработало

Спасибо за помощь заранее

2 ответа

Решение

Вы должны загружать все свои изображения в начале, а не создавать их каждый раз, когда они вам нужны.

Помимо того, что вы загружаете изображения на KeyEventsпереопределяешь paint который не использует преимущества оптимизированного механизма рисования двойной буферизации Swing. Переопределение paint скорее, чем paintComponent вызывает мерцание.

Переместите функциональность рисования в новый класс JComponent и переопределить paintComponent скорее, чем paint не забывая призывать super.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;
    }
}

Не связано, но рассмотрите возможность использования Key Bindings, а KeyListeners обрабатывает взаимодействие с KeyStrokes

Другие вопросы по тегам