Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[JS]Kolizje prostokątów 2D

Ostatnio zmodyfikowano 2012-01-20 16:19
Autor Wiadomość
skovv
Temat założony przez niniejszego użytkownika
[JS]Kolizje prostokątów 2D
» 2012-01-20 10:03:04
Witam. Od pewnego czasu piszę silniczek do gier, jak narazie idzie nawet sprawnie. Doszedłem do momentu w którym potrzebne są mi kolizje prostokątów z uwzględnieniem obrotu. Mógłby ktoś podpowiedzieć jak to zrobić? Mam 2 obiekty, każdy ma podane:

this.X = x;
this.Y = y;
this.W = 64;
this.H = 64;
this.Angle = 50;// <- Obrót
Rysuję sobie spriteya okręconego o ileś stopni, w koło niego niebieskie linie( dla sprawdzenia poprawności kolizji ), tylko mam problem z najważniejszym... jak sprawdzić te kolizje :|
P-48883
madmike44
» 2012-01-20 11:38:44
Masz wymiary i znasz położenie. Wszystko zależy jeszcze od tego, jaka jest oś obrotu i stan początkowy. Przyjmując oś na środku prostokąta, przy obrocie jego wierzchołki poruszają się po jednym i tym samym okręgu, więc określenie ich położenia po obrocie nie jest problemem. Stricte matematycznie kolizja wygląda w tym przypadku tak:

1. Jeżeli okręgi, o których mówiłem, nie przecinają się, to na pewno nie zachodzi kolizja.
2. Jeżeli okręgi się przecinają, należy sprawdzić, czy przecinają się ze sobą dowolne dwa odcinki, z których zbudowane są dwa różne prostokąty.

Punkt pierwszy jest najprostszą optymalizacją, jaką można tutaj wprowadzić. Można też pomyśleć nad innymi, mniej oczywistymi faktami :)

Najlepiej byłoby oczywiście, gdybyś napisał, z czym konkretnie masz problem i pokazał kawałek kodu..
P-48884
skovv
Temat założony przez niniejszego użytkownika
» 2012-01-20 12:41:30
Tzn konkretnie to nigdy nie pisałem takowych kolizji( jak już to prosto stojących kwadratów ). Stworzyłem sobie w klasie silniczka 3 funkcje:

this.CollisionMask = function( xx, yy, ww, hh, offX, offY, dir ){
var maskacol = {
X: xx,// pozycja
Y: yy,
W: ww,
H: hh,
OX: offX,// offset( przesuniecie, uzywam do zaznaczania spriteya na sorku )
OY: offY,
D: dir// obrot
};
return maskacol;
}
this.CollisionMaskDraw = function( cmask ){
this.Save();// standardowo w html5 zapis stanu
this.Translate( cmask.X, cmask.Y );// wybranie pozycji do dzialania
this.Rotate( cmask.D );// obrot
this.DrawRectangle( this.ViewX+cmask.OX, this.ViewY+cmask.OY, cmask.W, cmask.H, 1, "blue", "" );// i rysowanie kwadratu
this.Restore();
}
this.CollisionMaskUpdate = function( cmask, xx, yy, ww, hh, offx, offy, dir ){
cmask.X = xx;// update stanu( jesli obiekt sie przemieszcza )
cmask.Y = yy;
cmask.W = ww;
cmask.H = hh;
cmask.OX = offx,
cmask.OY = offy,
cmask.D = dir;
}

I w sumie nie wiem jak to zrobić dalej :|
P-48886
madmike44
» 2012-01-20 16:19:20
Skoro nie wiesz za dużo, poszukaj sobie na forum tematów dotyczących kolizji - było ich kilkadziesiąt. A więc:

Frazy, które należy wpisać w wyszukiwarkę google:
P-48928
« 1 »
  Strona 1 z 1