Мигает графика - PullRequest
       34

Мигает графика

1 голос
/ 22 октября 2011

Когда я запускаю программу, все работает нормально, все работает и все такое, но графика постоянно мигает.Я новичок в подобных вещах и не знаю, как это исправить.

import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;


public class MovementTest extends Frame implements Runnable, MouseMotionListener, KeyListener {

    private static Thread thread;
    private int mouseX, mouseY;
    private boolean movingRight;
    private boolean movingLeft;
    private boolean movingUp;
    private boolean movingDown;

    private Rectangle player = new Rectangle(50, 50, 100, 100);
    private Rectangle wallOne = new Rectangle(400, 50, 100, 100);

    public MovementTest() {
        setSize(800, 600);
        setVisible(true);
        addKeyListener(this);
        addMouseMotionListener(this);
    }

    public static void main(String[] args) {
        thread = new Thread(new MovementTest());
        thread.start();
    }

    @Override
    public void run() {
        try {
            while(true) {
                if(player.intersects(wallOne)) {
                    thread.stop();
                    break;
                }
                if(movingRight) {
                    player.x++;
                } else if(movingLeft) {
                    player.x--;
                }
                if(movingUp) {
                    player.y--;
                } else if(movingDown) {
                    player.y++;
                }
                paint(getGraphics());
                Thread.sleep(5);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void keyPressed(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_D)
            movingRight = true;
        if (key == KeyEvent.VK_A)
            movingLeft = true;
        if (key == KeyEvent.VK_W)
            movingUp = true;
        if (key == KeyEvent.VK_S)
            movingDown = true;
    }

    @Override
    public void keyReleased(KeyEvent e) {
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_D)
            movingRight = false;
        if (key == KeyEvent.VK_A)
            movingLeft = false;
        if (key == KeyEvent.VK_W)
            movingUp = false;
        if (key == KeyEvent.VK_S)
            movingDown = false;
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub

    }

    public void paint(Graphics g) {
        g.drawString("x: " + mouseX + " y: " + mouseY, 5, 35);
        g.drawRect(player.x, player.y, 100, 100);
        g.drawRect(wallOne.x, wallOne.y, 100, 100);
        repaint();
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseMoved(MouseEvent e) {
        mouseX = e.getX();
        mouseY = e.getY();
    }
}

Ответы [ 2 ]

4 голосов
/ 22 октября 2011

Вы определенно хотите изучить двойную буферизацию. Прямо сейчас то, что вы делаете, рисует все прямо на экране, и пользователь видит это. Что делает двойная буферизация, так это то, что она сначала рисует все в внеэкранном буфере (изображение), и как только все это вычисляется и изображение готово, вы рисуете внеэкранный буфер в видимом буфере (таким образом, пользователь видит только последний кадр, а не промежуточные кадры).

Это похоже на то, что чаще всего делают приложения OpenGL или Direct3D. У них есть два буфера. Все выводится в внеэкранный буфер, и как только это будет сделано, буферы меняются местами, а тот, который теперь находится за пределами экрана, очищается, после чего на него снова рисуется новое изображение.

И, как также указывал световой кодер, у вас действительно высокий fps. Попробуйте синхронизировать его с частотой обновления монитора, чтобы не тратить ресурсы чаще, чем это необходимо.

1 голос
/ 22 октября 2011

Возьмите перекрасить из вашего метода краски. Вы действительно не хотите этого там. Вот что вызывает твою проблему.

После этого добавьте это - это помогает поддерживать порядок в долгосрочной перспективе.

public void update() {
    repaint();
}

Затем добавьте методы перерисовки, куда вы перемещаете вещи. Вы также захотите добавить очистку в свой метод рисования. Это на самом деле позволит вашим прямоугольникам двигаться. Обновление: я заметил, что у вас уже есть что перерисовать. Отлично. Хотя это очень быстро (200 кадров в секунду!), Так что вы определенно захотите изучить двойную буферизацию.

Позже мы можем поговорить о двойной буферизации :) Но вы можете использовать Google для этого или что-то в этом роде.

...