Перекрасить квадрат? - PullRequest
       33

Перекрасить квадрат?

2 голосов
/ 27 августа 2011

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

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.*;

public class Pong {
    public static void main(String args[]) {
        Frame f = new Frame("Pong");
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        f.add(new PongField(Color.black), BorderLayout.CENTER);
        f.setResizable(false);
        f.pack();
        f.setVisible(true);

    }
}

class PongField extends Canvas {

    boolean playing = true;
    boolean running = true;

    public PongField(Color mainscreen) {
        setForeground(mainscreen);
    }

    public Dimension getPreferredSize() {
        return new Dimension(600, 600);
    }

    public void paint(Graphics g) {
        while (true) {
            Dimension size = getSize();
            PointerInfo a = MouseInfo.getPointerInfo();
            Point b = a.getLocation();

            a = MouseInfo.getPointerInfo();
            b = a.getLocation();

            int x = size.width / 2;
            int y = (int) b.getY();

            g.fillRect(x / x * 10, y, 10, 75);
            g.drawLine(size.width / 2 - 5, 0, size.width / 2 - 5, size.height);

            if (y != (int) b.getY())
                y = (int) b.getY();
        }
    }
}

Ответы [ 2 ]

3 голосов
/ 27 августа 2011

Вам не нужен цикл в paint () - на самом деле это ужасно, ужасно, так как в противном случае он заморозит весь графический интерфейс (ни один другой компонент не сможет рисовать сам, никогда!)цикл «while», оставляя только тело цикла.Затем сделайте так, чтобы paint () вызывался соответствующим образом, добавив MouseMotionListener, который вызывает repaint().В конструкторе сделайте что-то вроде:

addMouseMotionListener(new MouseMotionAdapter() {
    public void mouseMoved(MouseEvent me) {
        repaint();
    }
});

Это должно сделать это.Теперь, когда мышь движется, вызывается paint ().Стирание экрана позаботится о вас автоматически.

0 голосов
/ 27 августа 2011

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

  1. Очистка всего экрана черным каждый раз
  2. Рисование черным только над ранее нарисованной областью, затем рисование нового прямоугольника белым.

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

...