【发布时间】:2021-07-27 20:18:16
【问题描述】:
我有一个完美运行的碰撞检测功能,但前提是我将它放在我的游戏循环中(第 30 到 34 行)。如果我把它作为一个属性放在一个类中,然后在游戏循环中调用它,它就不起作用(第 16 到 20 行)。我还删除了该类的 player_2 实例的移动代码,因为我认为这与问题无关。任何帮助表示赞赏。
import pygame
pygame.init()
size = (500,500) #size[0] = width, size[1] = height
window = pygame.display.set_mode(size)
clock = pygame.time.Clock()
class Player:
def __init__(self, x, y, width, height, speed):
self.x = x
self.y = y
self.width = width
self.height = height
self.speed = speed
self.rect = pygame.Rect(x, y, width, height)
def collide(self):
if self.rect.colliderect(player_2.rect):
print('hello')
player_1 = Player(200, 200, 70, 70, 5)
player_2 = Player(60, 60, 70, 70, 5)
loop = True
while loop == True:
'''
def collide():
player_1_rect = pygame.Rect(player_1.x, player_1.y, player_1.width, player_1.height)
player_2_rect = pygame.Rect(player_2.x, player_2.y, player_2.width, player_2.height)
if player_1_rect.colliderect(player_2_rect):
print('hello')
'''
def movement():
keys = pygame.key.get_pressed()
for event in pygame.event.get():
if event.type == pygame.QUIT:
global loop
loop = False
if keys[pygame.K_a]:
player_2.x -= player_2.speed
if keys[pygame.K_d]:
player_2.x += player_2.speed
if keys[pygame.K_w]:
player_2.y -= player_2.speed
if keys[pygame.K_s]:
player_2.y += player_2.speed
window.fill((0, 0, 0))
clock.tick(60)
movement()
pygame.draw.rect(window, (255, 0, 0), (player_1.x, player_1.y, player_1.width, player_1.height))
pygame.draw.rect(window, (0, 0, 255), (player_2.x, player_2.y, player_2.width, player_2.height))
player_1.collide()
pygame.display.update()
【问题讨论】:
-
您的
Player.collide方法应该将其他玩家作为参数,而不是试图从外部范围内隐式拉出player_2。这很容易导致令人困惑的行为。
标签: python function methods pygame