Created
February 8, 2025 20:54
-
-
Save st0rmeed/3093b869816635c989eaff7cd1cfec08 to your computer and use it in GitHub Desktop.
collision.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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