Kolizja obiektów

0

Witam.
Jakiś czas temu zacząłem swoją przygodę z językiem Java. Próbuje napisać mini gierkę polegająca na przejściu labiryntu. Na razie jest to bardzo proste i "upośledzone". Obiekt już mi się porusza po planszy, jednak mam duży problem, z przeszkodami. Mianowicie chciałbym, aby mój obiekt nie przechodził, przez inne obiekty na planszy (czyt. ściany).
Proszę o jakieś podpowiedzi, instrukcje.



package maze;


import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class mm1 extends Applet implements KeyListener
{
	
	
	public Point loc; 
	public Point loc1; 
	public Rectangle r1;
	public Rectangle r2;
	public Rectangle r3;
	public Rectangle r4;
	public Rectangle r5;
	public Rectangle r6;
	public Rectangle r7;
	public Rectangle r8;
	public Rectangle r9;
	public Rectangle r10;
	public Rectangle r11;
	public Rectangle r12;
	
	public void init()
	{
		this.addKeyListener(this);
		r1 = new Rectangle(0,0,50,50);
		r2 = new Rectangle(200,0,5,300);
		r3 = new Rectangle(0,70,100,5);
		r4 = new Rectangle(100,150,5,70);
		r5 = new Rectangle(0,215,100,5);
		r6 = new Rectangle(0,400,200,5);
		r7 = new Rectangle(100,285,5,120);
		r8 = new Rectangle(300,300,5,600);
		r9 = new Rectangle(200,180,200,5);
		r10 = new Rectangle(400,300,200,5);
		r11 = new Rectangle(330,0,5,120);
		r12 = new Rectangle(450,450,50,50);
	}
	
	public void paint (Graphics g)
	{
		setSize(500,500);
		Graphics2D g2 = (Graphics2D)g;
		g2.fill(r1);
		g2.fill(r2);
		g2.fill(r3);
		g2.fill(r4);
		g2.fill(r5);
		g2.fill(r6);
		g2.fill(r7);
		g2.fill(r8);
		g2.fill(r9);
		g2.fill(r10);
		g2.fill(r11);
		g2.fill(r12);

	
	}
	

	
	



	
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode()==KeyEvent.VK_RIGHT)
		{
			loc=r1.getLocation();
			loc=r2.getLocation();
			;
			if(loc==loc1)
			{
				
			}
			else
			{
				r1.setLocation(r1.x+2, r1.y);
			}
		}
		else if (e.getKeyCode()==KeyEvent.VK_LEFT)
		{
			r1.setLocation(r1.x-2, r1.y);
		}
		else if (e.getKeyCode()==KeyEvent.VK_UP)
		{
			r1.setLocation(r1.x, r1.y-2);
		}
		else if (e.getKeyCode()==KeyEvent.VK_DOWN)
		{
			r1.setLocation(r1.x, r1.y+2);
		}
		repaint();
	}


	public void keyReleased(KeyEvent e) {
		
		
	}


	public void keyTyped(KeyEvent e) {
		
		
	}



}

0

Gdybyś miał mieć 1000 prostokątów to stworzyłbyś tysiąc pól klasy?

0

Klasa Rectangle ma metode intersects() która zwraca true, jeśli dwa Rectanlge się "dotykają"

0
  1. Twój kod jest ekstremalnie nieczytelny. Dlaczego obiekt poruszający się nazywa się "r1", a przeszkody - "r2", "r3", "r4"... ?
  2. Korzystaj z tablic lub kolekcji. Zamiast:
public class mm1 extends Applet implements KeyListener
{	
	// ...
	public Rectangle r1;
    public Rectangle r2;
    public Rectangle r3;
	/// ...
	
	public void init()
    {
		// ...
	    r1 = new Rectangle(0,0,50,50);
        r2 = new Rectangle(200,0,5,300);
		// ...
	}
	
	
    public void paint (Graphics g)
    {
		// ...
        g2.fill(r1);
        g2.fill(r2);
		// ...
	}
}

lepiej jest zrobić:

public class mm1 extends Applet implements KeyListener
{	
	// ...
	public Rectangle moveable; // obiekt, który się porusza
	public Rectangle[] obstaclesArray; // tablica przeszkód
	/// ...
	
	public void init()
    {
		// ...
		moveable = new Rectangle(0,0,50,50);
		obstaclesArray = new Rectange[11];
	    obstaclesArray[0] = new Rectangle(200,0,5,300);
        obstaclesArray[1] = new Rectangle(0,70,100,5);
		// ...
	}
	
	
    public void paint (Graphics g)
    {
		// ...
		g2.fill(moveable); 
        Stream.of(obstaclesArray).forEach(r -> g2.fill(r));
	}
}
  1. Rozpisz czytelniej obsługę klawiszy, np. (da się to zrobić prościej, ale nie chcę za bardzo mieszać w głowie)
 
    public void keyPressed(KeyEvent e) {
		int newX = moveable.x;
		int newY = moveable.y;
		
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){ newX = newX + 2; } 
		if(e.getKeyCode()==KeyEvent.VK_LEFT){ newX = newX - 2; } 
		if(e.getKeyCode()==KeyEvent.VK_UP){ newY = newY - 2; } 
		if(e.getKeyCode()==KeyEvent.VK_DOWN){ newY = newY + 2; } 
		
	}
  1. Chcesz zrobić prosty model kolizji - najłatwiej będzie po prostu porównywać współrzędne przy pomocy metody:
	private boolean canMove(int newX, int newY){
		// sprawdzenie, czy para (newX,newY) nie znajduje się w żadnym z kwadratów zdefiniowanych w obstaclesArray i/lub nie wyjdzie poza ramkę
	}

i potem skorzystać z niej skorzystać:

	public void keyPressed(KeyEvent e) {
		int newX = moveable.x;
		int newY = moveable.y;
		
		if(e.getKeyCode()==KeyEvent.VK_RIGHT){ newX = newX + 2; } 
		if(e.getKeyCode()==KeyEvent.VK_LEFT){ newX = newX - 2; } 
		if(e.getKeyCode()==KeyEvent.VK_UP){ newY = newY - 2; } 
		if(e.getKeyCode()==KeyEvent.VK_DOWN){ newY = newY + 2; } 
		
		if(canMove(newX, newY)){
			moveable.setLocation(newX, newY);
		}
	}
0

Tak jak pisałem, można powiedzieć, że dopiero raczkuje jeżeli chodzi o Jave. I kompletnie nie mam pomysłu jak "wykryc" kolizje.
Dziękuje za wszystkie informacje. Będę wdzięczny, jeśli ktoś jeszcze bardziej opisze sprawdzenie wystapienia kolizji ( o ile to mozliwe).

0

Hej. Proszę bardzo:

	private void checkCollisions() {
		Rectangle ballRectangle = ball.getBounds();
		Rectangle redRectangle = red.getBounds();
		Rectangle blueRectangle = blue.getBounds();
		if(ballRectangle.intersects(redRectangle)){
			if(red.getDy() > 0){
				ball.setDy(1);
			}else if(red.getDy() < 0){
				ball.setDy(-1);
			}
			ball.setDx(1);
		}else if(ballRectangle.intersects(blueRectangle)){
			if(blue.getDy() > 0){
				ball.setDy(1);
			}else if(blue.getDy() < 0){
				ball.setDy(-1);
			}
			ball.setDx(-1);
		}else if(ball.getY() == top + ball.getR()){
			ball.setDy(1);
		}else if(ball.getY() == bottom - ball.getR()){
			ball.setDy(-1);
		}else if (blueRectangle.intersectsLine(0, 0, rightCorner, 0) || blueRectangle.intersectsLine(0, bottom, rightCorner, bottom)){
			blue.setDy(0);
		}else if (redRectangle.intersectsLine(0, 0, rightCorner, 0) || redRectangle.intersectsLine(0, bottom, rightCorner, bottom)){
			red.setDy(0);
		}else if(ball.getBounds().intersectsLine(rightCorner, top, rightCorner, bottom)){
			addRedPoint();
		}else if(ball.getBounds().intersectsLine(leftCorner, top, leftCorner, bottom)){
			addBluePoint();
		}
	}

generalnie gra ma pętle główną, która robi takie rzeczy:

while(true){
zmiana pozycji();
detekcja kolizji();
odrysowanie();
}

Przykład:

		while(inGame){
			ball.move();
			blue.move();
			red.move();
			checkCollisions();
			try {
				Thread.currentThread().sleep(5);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			window.repaint();
		}
		if(redCount == WIN_COUNT){
			JOptionPane.showMessageDialog(window, "Czerowny zawodnik wygrał!", "Gratulacje", JOptionPane.INFORMATION_MESSAGE);
		}else if(blueCount == WIN_COUNT){
			JOptionPane.showMessageDialog(window, "Niebieski zawodnik wygrał!", "Gratulacje", JOptionPane.INFORMATION_MESSAGE);
		}
		System.exit(0);
	}

całość możesz zobaczyć tutaj:
https://github.com/bartlomiej-gora/JPong/blob/master/src/pl/bgora/pong/GameThread.java

Pozdro.

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