Skip to content

Instantly share code, notes, and snippets.

@st0rmeed
Created February 8, 2025 20:54
Show Gist options
  • Save st0rmeed/3093b869816635c989eaff7cd1cfec08 to your computer and use it in GitHub Desktop.
Save st0rmeed/3093b869816635c989eaff7cd1cfec08 to your computer and use it in GitHub Desktop.
collision.py
import pygame
pygame.init()
WIDTH, HEIGHT = 900, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
# картинки
player_img = pygame.image.load("player.png").convert_alpha()
tiles = [pygame.image.load(f"tile{i}.png").convert_alpha()
for i in range(1, 4)]
# маски
player_mask = pygame.mask.from_surface(player_img)
tile_masks = [pygame.mask.from_surface(tile) for tile in tiles]
# подтвержденная позиция (реальная)
player_x, player_y = 100, 100
player_speed = 5
# пощизиции тайлов
tile_positions = [(300, 300), (350, 350), (500, 200)]
running = True
while running:
screen.fill((255, 255, 255))
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
keys = pygame.key.get_pressed()
# генерация позиций не подтвержденных, они будут подтверждены после проверки на коллизии
# эти позиции нужны для проверки коллизий нового положения игрока
new_x, new_y = player_x, player_y
if keys[pygame.K_LEFT]:
new_x -= player_speed
if keys[pygame.K_RIGHT]:
new_x += player_speed
if keys[pygame.K_UP]:
new_y -= player_speed
if keys[pygame.K_DOWN]:
new_y += player_speed
# проверка коллизий
move_allowed = True
for tile, (tx, ty) in zip(tile_masks, tile_positions): # объединение двух списков
# смещения игрока относительно тайла
offset_x, offset_y = new_x - tx, new_y - ty
print(offset_x, offset_y)
# если тайл накладывается, то ```move_allowed = False```
# .overlap() работает с относительными координатами
if tile.overlap(player_mask, (offset_x, offset_y)):
move_allowed = False
break
# если не колллизятся
if move_allowed:
player_x, player_y = new_x, new_y
# отрисовка тайлов
for tile, (tx, ty) in zip(tiles, tile_positions):
screen.blit(tile, (tx, ty))
# отрисовка игрока с подтвержденными позициями
screen.blit(player_img, (player_x, player_y))
pygame.display.flip()
pygame.time.delay(30)
pygame.quit()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment