Fix bug that prey might be placed elsewhere when prey's collision detection is done before snake's collision detection: Replace prey in following update step and not during collision detection.
This commit is contained in:
parent
d820318814
commit
a34198e290
@ -8,26 +8,33 @@ class Prey(GameObject):
|
|||||||
self.__bounding_box = pygame.rect.Rect(0, 0, size, size)
|
self.__bounding_box = pygame.rect.Rect(0, 0, size, size)
|
||||||
self.__color = color
|
self.__color = color
|
||||||
self.__window_size = window_size
|
self.__window_size = window_size
|
||||||
|
self.__next_pos = None
|
||||||
self.__place_randomly()
|
self.__place_randomly()
|
||||||
|
|
||||||
def __place_randomly(self) -> None:
|
def __place_randomly(self) -> None:
|
||||||
self.__bounding_box.center = [random.randint(0, max_val)
|
self.__next_pos = [random.randint(0, max_val)
|
||||||
for max_val in self.__window_size]
|
for max_val in self.__window_size]
|
||||||
|
|
||||||
|
|
||||||
def __collides_with_other(self, game_objs: list[GameObject]) -> bool:
|
def __collides_with_other(self, pos: tuple, game_objs: list[GameObject]) -> bool:
|
||||||
|
box = pygame.rect.Rect(self.__bounding_box)
|
||||||
|
box.center = pos
|
||||||
|
|
||||||
for obj in game_objs:
|
for obj in game_objs:
|
||||||
if not isinstance(obj, Prey) and self.get_bounding_boxes()[0].collidelist(obj.get_bounding_boxes()) > -1:
|
if not isinstance(obj, Prey) and box.collidelist(obj.get_bounding_boxes()) > -1:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
def draw(self, surface: pygame.surface.Surface) -> None:
|
def draw(self, surface: pygame.surface.Surface) -> None:
|
||||||
pygame.draw.rect(surface, color=self.__color, rect=self.__bounding_box)
|
pygame.draw.rect(surface, color=self.__color, rect=self.__bounding_box)
|
||||||
|
|
||||||
|
|
||||||
def update(self, user_input: int, game_objs: list[GameObject]):
|
def update(self, user_input: int, game_objs: list[GameObject]):
|
||||||
while self.__collides_with_other(game_objs):
|
self.__bounding_box.center = self.__next_pos
|
||||||
self.__place_randomly()
|
|
||||||
|
while self.__collides_with_other(self.__next_pos, game_objs):
|
||||||
|
self.__place_randomly()
|
||||||
|
|
||||||
|
|
||||||
def get_bounding_boxes(self) -> list[pygame.rect.Rect]:
|
def get_bounding_boxes(self) -> list[pygame.rect.Rect]:
|
||||||
return [self.__bounding_box]
|
return [self.__bounding_box]
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user