How to detect collisions between two rectangular objects or images in pygame
Как обнаружить столкновения между двумя прямоугольными объектами или изображениями в pygame
Я создаю игру, в которой игрок должен использовать чашу, чтобы ловить падающие предметы. У меня есть несколько изображений предметов в списке и изображение чаши, которая используется для ловли предметов. Элементы продолжают падать и возвращаются в верхнюю часть экрана, если достигают границы (нижнего края). Я реализовал эту логику, которая позволяет предметам падать, но я не знаю, как определить, когда происходит столкновение между чашей и предметом.
Мой код:
import math import pygame import random
pygame.init()
display_width = 800 display_height = 600
game_display = pygame.display.set_mode((display_width, display_height)) clock = pygame.time.Clock() pygame.display.set_caption("Catch the Ball")
white = (255, 255, 255) black = (0, 0, 0) red = (255, 0, 0) blue = (0, 255, 0)
Если вам нужны изображения (pygame.Surface объекты), ограничивающий прямоугольник можно получить с помощью get_rect(), где местоположение поверхности должно задаваться ключевым аргументом, поскольку возвращаемый прямоугольник всегда начинается с (0, 0):
player_rect = player_img.get_rect(topleft = (x, y)) for i inrange(len(things_cor)): thing_rect = things_added[i].get_rect(topleft = things_cor[i])
if player_rect.colliderect(thing_rect): print("hit")
player(x, y) x += x_change
for i inrange(len(things_cor)): thing_x, thing_y = things_cor[i] things(thing_x, thing_y, things_added[i])
Используется pygame.time.get_ticks() для задержки начала игры на определенное время. pygame.time.get_ticks() возвращает количество миллисекунд с момента pygame.init() вызова. Например:
defgame_loop(): # [...]
while running: passed_time = pygame.time.get_ticks() # passed time in milliseconds start_time = 100 * 1000# start time in milliseconds (100 seconds)
# [...]
# move player if passed_time >= start_time: x += x_change if x < 0: x = 0 elif x > display_width - player_width: x = display_width - player_width
# move things if passed_time >= start_time: for i inrange(len(things_cor)): things_cor[i][1] += y_change if things_cor[i][1] > display_height: things_cor[i][1] = random.randint(-2000, -1000) things_cor[i][0] = random.randint(0, display_width) things_added[i] = random.choice(thing_imgs)