Я хочу проверить на столкновение в Pygame. Я хочу, чтобы, когда мой игрок врезался в стену, он останавливался - PullRequest
2 голосов
/ 02 мая 2020

Я - новичок, и я немного разбираюсь в Pygame, поэтому я решил не делать ничего сам, чтобы практиковать свои навыки. Я уже знаю столкновение, но я не знаю, как именно вы проверяете. Я делаю копию Приключения. Я мог бы звучать так смущающе. Простите за это. Вот код, который у меня есть сейчас:

import pygame
import sys
from pygame.locals import *

clock = pygame.time.Clock()

pygame.init()

pygame.display.set_caption("Neverout")
player = pygame.image.load("player.png")

green = (164, 164, 164)

WINDOW_SIZE = (1200, 700)

screen = pygame.display.set_mode(WINDOW_SIZE, 0, 32)

wall_rect = pygame.Rect(0, 0, 1200, 50)
wall_rect2 = pygame.Rect(0, 0, 50, 1200)
wall_rect3 = pygame.Rect(50, 650, 450, 50)
wall_rect4 = pygame.Rect(1150, 0, 50, 700)
wall_rect5 = pygame.Rect(700, 650, 750, 50)

player_pos = [385, 385]

up = False
down = False
right = False
left = False

while True:

    screen.blit(player, player_pos)

    if left is True:
        player_pos[0] -= 8
    if right is True:
        player_pos[0] += 8
    if up is True:
        player_pos[1] -= 8
    if down is True:
        player_pos[1] += 8

    for event in pygame.event.get():

        if event.type == KEYDOWN:
            if event.key == pygame.K_LEFT:
                left = True
            elif event.key == pygame.K_RIGHT:
                right = True
            elif event.key == pygame.K_UP:
                up = True
            elif event.key == pygame.K_DOWN:
                down = True

        elif event.type == KEYUP:
            if event.key == pygame.K_LEFT:
                left = False
            elif event.key == pygame.K_RIGHT:
                right = False
            elif event.key == pygame.K_UP:
                up = False
            elif event.key == pygame.K_DOWN:
                down = False

        elif event.type == QUIT:
            pygame.quit()
            sys.exit()

    pygame.display.update()
    screen.fill(green)
    pygame.draw.rect(screen, (230, 218, 0), wall_rect)
    pygame.draw.rect(screen, (230, 218, 0), wall_rect2)
    pygame.draw.rect(screen, (230, 218, 0), wall_rect3)
    pygame.draw.rect(screen, (230, 218, 0), wall_rect4)
    pygame.draw.rect(screen, (230, 218, 0), wall_rect5)
    clock.tick(60)

1 Ответ

1 голос
/ 02 мая 2020

Создание списка стен:

wall_list = [wall_rect, wall_rect2, wall_rect3, wall_rect4, wall_rect5]

Сохранение позиции игрока перед перемещением игрока:

prev_pos = player_pos[:] 

Получение текущего прямоугольника (pygame.Rect ) после перемещения игрока:

plyer_rect = player.get_rect(topleft = player_pos)

Используйте colliderect(), чтобы оценить, пересекает ли plyer_rect прямоугольник any из wall_list. Если игрок ударяется о стену, отмените движение:

if any(plyer_rect.colliderect(w) for w in wall_list):
    player_pos = prev_pos 

Кроме того, я рекомендую использовать pygame.key.get_pressed() вместо ключевых событий для движения игрока:

keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
    player_pos[0] -= 8
if keys[pygame.K_RIGHT]:
    player_pos[0] += 8
if keys[pygame.K_UP]:
    player_pos[1] -= 8
if keys[pygame.K_DOWN]:
    player_pos[1] += 8

Полный пример:

import pygame
import sys
from pygame.locals import *

clock = pygame.time.Clock()

pygame.init()

pygame.display.set_caption("Neverout")
player = pygame.image.load("player.png")

green = (164, 164, 164)

WINDOW_SIZE = (1200, 700)

screen = pygame.display.set_mode(WINDOW_SIZE, 0, 32)

wall_rect = pygame.Rect(0, 0, 1200, 50)
wall_rect2 = pygame.Rect(0, 0, 50, 1200)
wall_rect3 = pygame.Rect(50, 650, 450, 50)
wall_rect4 = pygame.Rect(1150, 0, 50, 700)
wall_rect5 = pygame.Rect(700, 650, 750, 50)

wall_list = [wall_rect, wall_rect2, wall_rect3, wall_rect4, wall_rect5]

player_pos = [385, 385]

while True:

    for event in pygame.event.get():
        if event.type == QUIT:
            pygame.quit()
            sys.exit()

    prev_pos = player_pos[:] 
    keys = pygame.key.get_pressed()
    if keys[pygame.K_LEFT]:
        player_pos[0] -= 8
    if keys[pygame.K_RIGHT]:
        player_pos[0] += 8
    if keys[pygame.K_UP]:
        player_pos[1] -= 8
    if keys[pygame.K_DOWN]:
        player_pos[1] += 8

    plyer_rect = player.get_rect(topleft = player_pos)
    if any(plyer_rect.colliderect(w) for w in wall_list):
        player_pos = prev_pos  

    pygame.display.update()
    screen.fill(green)
    screen.blit(player, player_pos)
    for w in wall_list:
        pygame.draw.rect(screen, (230, 218, 0), w)
    clock.tick(60)
...