Grafika w Javie

0

Witam, dopiero się uczę Javy...
Mam zadanie: zrobić kółko odbijające się od wszystkich ścianek - i spoko udało się
w metodzie mam algoryrm

if (x <= 0 || (x + srednica) >= oknoX) {
				vx = -vx;
}
if (y <= 0 || (y + srednica) >= oknoY) {
				vx = -vx;
}
x = x - vx;
y = y - vy;

I w momencie zderzenia się ze ścianką zmienia vektor i tak sobie lata po ekranie.
teraz próbuję dodać warunek z przeszkodą (powiedzmy prostokąt)
Rysuję sobie prostokąt:

g.fillRect(prostokatX, prostokatY, wielkoscX, wielkoscY);

i próbuję zmodyfikować warunek:
do warunku - jeżeli X <= 0 lub Jeżeli X+srednica >= wielkoscOkna zmień kierunek
lub Jeżeli X >= prostokatX i X <= prostokatX+WielkoscY zmień kierunek
Tak żeby odbijał mi się o jedną pionową ściankę - ale nie działa

|| ((x + srednica) >= prostokatX && (x + srednica) <= prostokatX+ wielkoscY)

Zatrzymuje mi się na szerokości prostokąta - na całek wysokości okna...
Co robię źle?

Docelowo, chcę napisać program odbijający się o przeszkody

2

Sprawdzanie kolizji koło <-> prostokąt jest trochę bardziej złożone - porównaj sobie to z algorytmami np. tu: https://stackoverflow.com/questions/401847/circle-rectangle-collision-detection-intersection.

1

Rozrysuj sobie na kartce i sprawdź dokładnie te warunki, albo skorzystaj z metod intersect, contains https://docs.oracle.com/javase/7/docs/api/java/awt/Shape.html

0

Dzięki sprawdzę, drugie podejście jakie chciałam zastosować to zrobić jakiś punktów zastrzeżonych, które będą zbierać się w obszar + granica długości r, ale nadal ciężko mi wychodzi ustalanie granic tych obszarów - albo przez nie kulka przelatuje, albo dociera do pierwszej ściany i na całej długości się jej trzyma...

0
x += vx;
y += vy;

if (x - srednica < 0) {
  vx = -vx;
  x = srednica; 
} 
else if (x + srednica > oknoX) {
  vx = -vx;
  x = oknoX - srednica;
}

if (y - srednica < 0) {
  vy = -vy;
  y = srednica;
} else if (y + srednica > oknoY) {
  vy = -vy;
  y = oknoY - srednica;
}

Mniej więcej tak powinno wyglądać odbijanie się od ścianek,
(=) w warunkach może prowadzić do jakiś sklejeń czy coś.

0

@gk1982: to tak mam od ścian zrobione :P

W tej chwili rysuję w paintComponent(Graphics g)
Da się tam przerobić to g na kółko z Rectangle2d - aby mieć dostęp do metody intersect?

a w klasie odpowiadającej za animacje sprawdzam i reprintuję x,y kółka

protected void paintComponent(Graphics g) {
		if (x < 0)
			x = 0;
		super.paintComponent(g);
		((Graphics2D) g).setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

		g.setColor(c);
		g.fillOval((int) x, (int) y, (int) s, (int) s);
		g.setColor(Color.BLACK);

		g.fillRect(pX1, pY1, wpX1, wpY1);
	}
	public static int intersectShape(Shape k, double x, double y, double w, double h) {
		  if (!k.getBounds2D().intersects(x, y, w, h)) {
		    return 0;
		  }
		  return 1;
	}
	
	public void animacje() {
		boolean b = true;
		while (b) {
		Shape k = new Ellipse2D.Double(x, y, s, s);
                z=intersectShape(k, pX1, pY1, wpX1, wpY1);
			double sKolaX = x + r;
			double sKolaY = y + r;
			System.out.println(sKolaX + " " + sKolaY);
			

			
			if ((x <= 0 || (x + s) >= oknoX || z==1)) {
				vx = -vx;
			}
			if (y <= 0 || (y + s) >= oknoY || z==1) {
				vy = -vy;
			}
			x = x - vx;
			y = y - vy;

			try {
				Thread.sleep(5);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			repaint();
		}

	}

	public Dimension getPreferredSize() {
		return new Dimension(sizeX, sizeY);

	}

Działa jakoś, ale nie wiem jak wykryć czy zderzenie nastąpiło z góry czy z dołu...

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