Генерация нескольких прямоугольников

Возможный дубликат:
Рисование нескольких пикселей/прямоугольников

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

это мой метод

public void drawParticle(float x, float y){
    g.drawRect(x, y, 4, 4);
}

Основной класс Control вызывает метод drawParticle;

import java.awt.Point;
import java.awt.geom.Point2D;

import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;

public class Control extends BasicGameState {
    public static final int ID = 1;

    public Methods m = new Methods();
    public Graphics g = new Graphics();

    int mouseX;
    int mouseY;


    public void init(GameContainer container, StateBasedGame game) throws SlickException{
    }

    public void render(GameContainer container, StateBasedGame game, Graphics g) throws SlickException {
        m.drawParticle(mouseX, mouseY);
    }

    public void update(GameContainer container, StateBasedGame game, int delta) {
    }

    public void mousePressed(int button, int x, int y) {
        mouseX = x;
        mouseY = y;
    }

    public int getID() {
        return ID;
    }

}

Спасибо - Шамус


person user1610541    schedule 08.10.2012    source источник
comment
Нам нужно больше вашего кода, чтобы помочь вам. Например: Как называется drawParticle?   -  person Stefan Neubert    schedule 08.10.2012
comment
хорошо, добавил класс, который вызывает метод   -  person user1610541    schedule 08.10.2012
comment
@user1610541 user1610541 у вас есть другие методы рисования/раскраски?   -  person Serhiy    schedule 08.10.2012
comment
Это именно то, что я искал! Любая идея, как я мог это сделать?   -  person user1610541    schedule 08.10.2012
comment
У меня была добыча в документации Slick2D, кажется, что она перерисовывает все, когда вызывается метод рендеринга. Итак, я предлагаю вам попробовать добавить какой-нибудь список, после каждого щелчка сохраняйте там точку, а когда вы выполняете рендеринг, перебирайте список и рисуйте каждый прямоугольник.   -  person Serhiy    schedule 08.10.2012
comment
ладно, логично! но теперь, как мне сохранить щелчки мыши в списке? массивы? я новичок в них и немного не понимаю :L   -  person user1610541    schedule 08.10.2012
comment
В методе mousePressed() сохраните значения x и y для класса Point, например (путем вызова Point point = new Point(x,y)). Сохраните точку в некоторый ArrayList (или любую другую структуру данных). Просто убедитесь, что вы инициализируете свой ArrayList только один раз. В mousePressed() добавьте значение точки в ArrayList и, наконец, в рендере сделайте некоторый цикл, чтобы получить все точки и отрисовать их. Надеюсь, это поможет.   -  person Serhiy    schedule 08.10.2012


Ответы (2)


Один из способов сделать это — создать List в качестве переменной-члена и добавлять новый Rectangle каждый раз, когда пользователь щелкает мышью. Затем в вашем методе render() выполните итерацию по List из Rectangle и закрасьте каждую из них.

person Code-Apprentice    schedule 08.10.2012
comment
Ну, это именно то, что я сказал :D единственное, что я не понимаю механику Slick 2D :S - person Serhiy; 08.10.2012
comment
@Serhiy yah, я прочитал ваши комментарии после того, как написал этот ответ =p - person Code-Apprentice; 08.10.2012

Короче говоря, вам нужно вести список объектов, которые вы хотите рисовать в каждом цикле рисования.

введите здесь описание изображения

public class ColorMeRectangles {

    public static void main(String[] args) {
        new ColorMeRectangles();
    }

    public ColorMeRectangles() {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setSize(400, 400);
                frame.setLocationRelativeTo(null);
                frame.setLayout(new BorderLayout());
                frame.add(new RectanglePane());
                frame.setVisible(true);

            }
        });

    }

    public class RectanglePane extends JPanel {

        private Point mousePoint;
        private List<Partical> particals;
        private Timer generator;
        private int min = -4;
        private int max = 4;

        public RectanglePane() {

            setBackground(Color.BLACK);

            particals = new ArrayList<Partical>(25);

            addMouseMotionListener(new MouseAdapter() {
                @Override
                public void mouseMoved(MouseEvent e) {
                    mousePoint = e.getPoint();
                    repaint();
                }
            });

            generator = new Timer(125, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {

                    if (mousePoint != null) {

                        int x = mousePoint.x + (min + (int) (Math.random() * ((max - min) + 1)));
                        int y = mousePoint.y + (min + (int) (Math.random() * ((max - min) + 1)));

                        Color color = new Color(
                                (int) (Math.random() * 255),
                                (int) (Math.random() * 255),
                                (int) (Math.random() * 255));

                        particals.add(new Partical(new Point(x, y), color));

                        repaint();

                    }

                }
            });
            generator.setRepeats(true);
            generator.setCoalesce(true);
            generator.start();

        }

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

            Graphics2D g2d = (Graphics2D) g.create();
            for (Partical partical : particals) {

                partical.paint(g2d);

            }

            if (mousePoint != null) {

                g2d.setColor(Color.WHITE);
                g2d.drawRect(mousePoint.x - 2, mousePoint.y - 2, 4, 4);

            }

            g2d.dispose();

        }
    }

    public class Partical {

        private Point location;
        private Color color;

        public Partical(Point location, Color color) {
            this.location = location;
            this.color = color;
        }

        public Point getLocation() {
            return location;
        }

        public Color getColor() {
            return color;
        }

        public void paint(Graphics2D g2d) {
            g2d.setColor(color);
            g2d.drawRect(location.x - 4, location.y - 4, 8, 8);
        }
    }
}
person MadProgrammer    schedule 08.10.2012