Kolizje i hitboxy
colliderect() pod maską — cztery porównania liczb, a hitbox nie musi pasować do widocznego obrazu pixel w pixel.
Kolizja to moment, gdy dwa obiekty gry przecinają się w przestrzeni, a gra
musi na to zareagować: piłka odbija się od ściany, postać podnosi monetę, pocisk
pokonuje wroga. U pygame.Rect istnieje gotowa metoda na to:
if igrok_rect.colliderect(vrag_rect):
print(„Kolizja!”)
Jak to jest naprawdę zorganizowane
colliderect() sprawdza przecięcie dwóch prostokątów,
Wyrównany do osi (AABB, axis-aligned bounding box) jest metodą redukcją pod maską
do czterech prostych porównań liczbowych:
def pryamougolniki_peresekayutsya(a, b):
ax1, ay1, aw, ah = a
bx1, by1, bw, bh = b
ax2, ay2 = ax1 + aw, ay1 + ah
bx2, by2 = bx1 + bw, by1 + bh
return ax1 < bx2 and ax2 > bx1 and ay1 < by2 and ay2 > by1
Dwa prostokąty nie przecinają się, jeśli jest się całkowicie po lewej, po prawej, Wyższe lub niższe niż pozostałe, powyższa kontrola ma na celu tylko upewnić się, że żadna z tych czterech Warunki nie są spełnione.
Hitbox nie zawsze jest tym samym co rysowanie
"Hitbox" to prostokąt (lub inny kształt), używany specjalnie do sprawdzania kolizji, i nie musi odpowiadać rozmiarowi widocznego rysunku znaku w Jeden. Okrągła kula z przezroczystymi krawędziami zwykle ma kwadratowy obraz — jeśli liczyć kolizja na pełnym kwadracie obrazu, gracz zobaczy niesprawiedliwe "trafienia" chybił", gdzie nic nie dotykało oka.
Rect pobiera się bezpośrednio z rozmiaru całego załadowanego obrazu, w tym przezroczystych pól wokół samej postaci. Rozwiązanie — zmniejszyć hitbox względem widocznego obrazu przez rect.inflate(-20, -20): inflate() zmiany ogólnie wymiary prostokąta, zachowując środek, dlatego -20 według szerokości i wysokości usuwa dokładnie 10 pikseli z każdej strony, a nie 20. Konkretne marginesy dobiera się wzrokowo dla każdego sprite'a.