Как изменить пиксели и использовать щелчок мышью? - PullRequest
0 голосов
/ 27 апреля 2020

Я разрабатываю проект лаборатории изображений для школы и не могу понять, как изменить rgb пикселей. Мой проект - игра для проверки зрения, в которой игроки выбирают один цвет, отличный от остальных. Должен ли я изменить пиксели фона или пустой фотографии? Кроме того, как мне реализовать mouseClickedAction (данный метод, который запускается при щелчке мышью)?

Вот несколько простых вещей, которые у меня есть:

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.image.ImageObserver;
import java.util.ArrayList;

public class EagleEye extends FlexiblePictureExplorer {
    public static Picture background = new Picture(1003,1003);

    //settings
    private int gameDimensions = 4;
    private int difficulty = 30;

    private final int statsHeight = 80;

    public EagleEye(DigitalPicture Picture) {
        super(background);
        setTitle("Eagle Eye");
        int xGrid = gameDimensions;
        int yGrid = gameDimensions;
        int r1 = (int)(Math.random() * gameDimensions + 1);
        int r2 = (int)(Math.random() * gameDimensions + 1);
        colorSetter(xGrid,yGrid);

    }

    private void colorSetter(int x,int y) {
        for (int i=0;i<x;i++) {
            for (int j=0;j<y;j++) {
                fillBox(i,j);
            }
        }
    }
    private void fillBox(int x, int y) {
        int r = (int)(Math.random() * 255 + 1);
        int g = (int)(Math.random() * 255 + 1);
        int b = (int)(Math.random() * 255 + 1);
        int x1;
        int x2;
        if (x==0) {
            x1 = 0;
            x2 = 250;
        }
        else if (x==1) {
            x1 = 252;
            x2 = 501;
        }
        else if (x==2) {
            x1 = 503;
            x2 = 752;
        }
        else {
            x1 = 754;
            x2 = 1003;
        }
        int y1;
        int y2;
        if (y==0) {
            y1 = 0;
            y2 = 250;
        }
        else if (y==1) {
            y1 = 252;
            y2 = 501;
        }
        else if (y==2) {
            y1 = 503;
            y2 = 752;
        }
        else {
            y1 = 754;
            y2 = 1003;
        }
        int rgb = calculateColors(r,g,b);
        for (int i=x1;i<=x2;i++) {
            for (int j=y1;j<=y2;j++) {
                background.setBasicPixel(x1,y1,rgb);
            }
        }
        setImage(background);
    }
    private int calculateColors(int r, int g, int b) {
        int r1 = r * 65536;
        int g1 = g * 256;
        int b1 = b;
        return r1 + g1 + b1;
    }
    private void drawStats(Picture img){
        Picture statsImg = new Picture(statsHeight, imageWidth);
        Graphics g = statsImg.getGraphics();
        g.setFont(new Font("Times New Roman", Font.PLAIN, 16));
        g.setColor(Color.blue);
    }
    private void updateImage() {

    }
    public void mouseClickedAction(DigitalPicture pict, Pixel pix) {

    }
    private void endGame() {

    }
    public boolean imageUpdate(Image arg0, int arg1, int arg2, int arg3, int arg4, int arg5) {
        // TODO Auto-generated method stub
        return false;
    }
    public static void main(String[] args) {
        Picture white = new Picture(100,100);
        EagleEye game = new EagleEye(white);

    }
}

1 Ответ

0 голосов
/ 28 апреля 2020

Я думаю, что самый простой способ рисования и графики - это не рисование на изображении, а рисование непосредственно в JPanel. Если у вас есть класс, расширяющий JPanel, вы можете реализовать

public void paintComponent(Graphics g) {
    //Code to draw whatever you like, e.g.
    g.setColor(new Color(255, 255, 255));
    g.drawRect(0, 0, width, height);
}

. При этом вам не придется беспокоиться об обработке изображений. Если вы все еще хотите использовать изображения, вы можете использовать BufferedImage, который есть отличные документы, объясняющие, как его использовать: https://docs.oracle.com/javase/tutorial/2d/images/drawonimage.html (Вам все равно нужно будет отобразить эти изображения, скорее всего, в любом случае с помощью метода paintComponent, приведенного выше, и если вы хотите нарисовать все oop, вы вам нужно будет поместить это l oop в другой поток, помните)

Что касается mouseClicked, вам нужно реализовать MouseListener, который довольно прост:

Создайте объект MouseListener в вашем классе вам придется реализовать несколько методов внутри него, большинство из которых, вероятно, будут go неиспользованными.

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

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

Объект MouseEvent в слушателе содержит всю полезную информацию, которая вам понадобится, например, его положение (относительно компонента, к которому вы добавили слушателя)

public class YourClass {

    public YourClass() {
        this.addMouseListener(ml);
    }

    //code


    private MouseListener ml = new MouseListener() {

        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub
            System.out.println(arg0.getX() + ", " + arg0.getY());
        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

    }


}
...