Przesuwanie kwadratów z użyciem tablicy

0

Witam, napisałem program na przesunięcie kwadratu za pomocą myszy. Chciałbym zrobić tak, że za pomocą tablicy tworze kilka kwadratów zdeklarowanych tą samą nazwą i jeśli najadę na jeden z nich to będę w stanie przesunąć i zmienić jego współrzędne.
Oto kod, który napisałem:

public class Component
{

	int kurX, kurY, kurWidth=3, kurHeight=3;
	int kwadrX=100, kwadrY=100;
        int rectangles[][] = {{0, 20, 50, 50},
                              {100, 50, 50, 50}};
        Rectangle kwadr;
	boolean kolizja;
	
	public static void main(String[] args) 
	{
		Component gui = new Component();
		gui.start();
	}
	
	public void start()
    {
    	JFrame okno = new JFrame();
    	Rysowanie panel = new Rysowanie();
    	
    	okno.setLayout(null);
    	
    	panel.setLayout(null);
    	panel.setBackground(Color.WHITE);
    	panel.setBounds(0, 0, 400, 400);
    	
    	okno.getContentPane().add(panel);
    	
    	okno.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	okno.setResizable(false);
    	okno.setSize(400, 400);
    	okno.setVisible(true);
    	panel.addMouseMotionListener(new Mysz());
    	panel.addMouseWheelListener(new Mysz());
    }
	
	public class Rysowanie extends JPanel
    {
	    public void paintComponent(Graphics g)
	    {
	    	Rectangle kursor = new Rectangle(kurX, kurY, kurWidth, kurHeight);
                
	    	g.setColor(Color.WHITE);
	    	g.fillRect(0, 0, 400, 400);
                
	    	
                
                for(int i = 0; i<rectangles.length; i++){
	    	kwadr = new Rectangle(rectangles[i][0], rectangles[i][1], 50, 50);
                g.setColor(Color.BLUE);
	    	g.fillRect(kwadr.x, kwadr.y, kwadr.width, kwadr.height);
                }
	    	
                g.setColor(Color.RED);
	    	g.fillRect(kursor.x, kursor.y, kursor.width, kursor.height);
                
	    	if(kursor.intersects(kwadr))
	    	{
	    		kolizja = true;
	    		g.setColor(Color.GREEN);
		    	g.fillRect(kursor.x, kursor.y, kursor.width, kursor.height);
	    	}
	    	else
	    		kolizja = false;
	    	repaint();
	    }
    }
    
    public class Mysz extends MouseAdapter
    {
    	public void mouseMoved(MouseEvent kurEv)
    	{
    		kurX = kurEv.getX()-kurWidth/2;
    		kurY = kurEv.getY()-kurHeight/2;
    	}
    	public void mouseDragged(MouseEvent ev)
    	{
    		kurX = ev.getX()-kurWidth/2;
    		kurY = ev.getY()-kurHeight/2;
    		if(kolizja)
    		{
                    if(rectangles[0][0] < ev.getX() && rectangles[0][0] + 50 > ev.getX() && rectangles[0][1] < ev.getY() && rectangles[0][1] + 50 > ev.getY()){
                    rectangles[0][0] = ev.getX()-25;
                    rectangles[0][1] =  ev.getY()-25;
                    }
                    else if(rectangles[1][0] < ev.getX() && rectangles[1][0] + 50 > ev.getX() && rectangles[1][1] < ev.getY() && rectangles[1][1] + 50 > ev.getY()){
                    rectangles[1][0] = ev.getX()-25;
                    rectangles[1][1] =  ev.getY()-25;
                    }
    		}
    	}
    }

}

Dodatkowo problemem jest również to, że program jako

kwadr

widzi tylko ostatni narysowany kwadrat.
Czyli

kwadr = new Rectangle(rectangles[0][0], rectangles[0][1], 50, 50);

nie jest przedstawiany jako kwadr tylko jako "nic".

0

Skorzystaj najlepiej z kolekcji zamiast to trzymać w tablicy jak i tak to potem wrzucasz jako Rectangle.
Nigdy nie rób sprawdzania kolizji w paint, rozumiem że na jego koniec i tak wywołujesz repaint, ale to i tak złe rozwiązanie. Lepiej zrobić prostą pętlę: choć to co zrobiłeś działać będzie.

while(!zakoncz){
sprawdzKolizje();
repaint();
//możesz dodać tu jakiegoś sleepa
}

kolizje z paint w ogóle wywal. ten kawałek kodu zapisz tak:

public void mouseDragged(MouseEvent ev)
            {
                    kurX = ev.getX()-kurWidth/2;
                    kurY = ev.getY()-kurHeight/2;
                    
                    for (int[] i : rectangles) {
	                    if(i[0] < ev.getX() && i[0] + 50 > ev.getX() && i[1] < ev.getY() && i[1] + 50 > ev.getY()){
	                    i[0] = ev.getX()-25;
	                    i[1] =  ev.getY()-25;
	                    }}
            }

Jak najedziesz jednym kwadratem na drugi to wydaje się że jeden znika, a tak naprawdę one się wtedy na siebie nakladają, bo napisałeś by się kwadrat przesunął po kolizji swoim środkiem w miejsce kursora.

0

Dzięki, ale nadal pozostaje jeden problem, a mianowicie z tym, że kolizja działa tylko z ostatnim narysowanym kwadratem. Pozostałych, czyli wcześniej narysowanych nie odczytuje jako kwadr przez co metoda intersects nie działa tak jak bym tego chciał.

0

Nie rozumiem co nie działa, u mnie po zmianie tej metody i usunięciu w paint kolizji są dwa kwadraty (bo tylko tyle ich wpisałeś do tablicy) i każdy daje się przemieszczać.

0

Tak, można je przemieszczać i są dwa kwadraty, ale napisałem dla sprawdzenia kolizji kwadracik pomocniczy, który jeśli się nie styka z żadnym z kwadratów niebieskich jest koloru czerwonego, a jeżeli dotknie jednego z niebieskich kwadratów to zmienia kolor na zielony. I tutaj właśnie jest problem, ponieważ zmienia kolor tylko przy dotknięciu kwadratu, który w tablicy zapisany jest jako "drugi".

0

Bo sprawdzasz kolizję tylko jednego kwadratu z myszką.
Powinno być tak:

public class Rysowanie extends JPanel
    {
            public void paintComponent(Graphics g)
            {
                    Rectangle kursor = new Rectangle(kurX, kurY, kurWidth, kurHeight);
 
                    g.setColor(Color.WHITE);
                    g.fillRect(0, 0, 400, 400);
 
                for(int i = 0; i<rectangles.length; i++){
                    kwadr = new Rectangle(rectangles[i][0], rectangles[i][1], 50, 50);
                g.setColor(Color.BLUE);
                    g.fillRect(kwadr.x, kwadr.y, kwadr.width, kwadr.height);
                }
                g.setColor(Color.RED);
                for(int i = 0; i<rectangles.length; i++){
                    kwadr = new Rectangle(rectangles[i][0], rectangles[i][1], 50, 50);
                    if(kursor.intersects(kwadr))
                    {
                            g.setColor(Color.GREEN);
                    }
                    }

                    g.fillRect(kursor.x, kursor.y, kursor.width, kursor.height);
                   
                    repaint();
            }
    } 

1 użytkowników online, w tym zalogowanych: 0, gości: 1