【问题标题】:Why won't my collision detection function work inside a class? [duplicate]为什么我的碰撞检测功能不能在类中工作? [复制]
【发布时间】: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


【解决方案1】:

.rect 属性用于碰撞检测。因此,您必须在移动对象之后或碰撞检测之前更新rect 属性:

while loop == True:
    # [...]

    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
    player_2.rect.topleft = player_2.x, player_2.y

但是,您根本不需要x ywidth height 属性。请改用rect 属性:

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.speed = speed
        self.rect = pygame.Rect(x, y, width, height)

    def collide(self, opponent):
        if self.rect.colliderect(opponent.rect):
            print('hello')
    
player_1 = Player(200, 200, 70, 70, 5)
player_2 = Player(60, 60, 70, 70, 5)

def movement():
    keys = pygame.key.get_pressed()
    player_2.rect.x += (keys[pygame.K_d] - keys[pygame.K_a]) * player_2.speed
    player_2.rect.y += (keys[pygame.K_s] - keys[pygame.K_w]) * player_2.speed

loop = True
while loop == True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            loop = False
    
    movement()
    player_1.collide(player_2)
      
    window.fill((0, 0, 0))
    pygame.draw.rect(window, (255, 0, 0), player_1.rect)
    pygame.draw.rect(window, (0, 0, 255), player_2.rect)
    pygame.display.update()
    clock.tick(60)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多