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/que[...]lision-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, botów: 0