我想检查pygame中是否有碰撞.我想,当我的球员撞墙时,他会停下来



我是一名初学者,我对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)

创建墙列表:

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是否与wall_listany矩形相交。如果玩家撞到墙上,则撤消移动:

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)

最新更新