微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

调用我的碰撞检测函数时应该输入哪些参数?

如何解决调用我的碰撞检测函数时应该输入哪些参数?

我在游戏循环的第 42 行调用 check_collision()。这样做的目的是检查两个矩形(游戏中的两个玩家)是否发生碰撞。我不清楚的是我应该使用什么论点。我不认为使用两个 rect 的 XY 坐标会起作用,而且我不知道有什么方法可以将 rect 分配给可用作参数的变量。任何帮助将不胜感激。

代码

import pygame,sys

pygame.init()

win = pygame.display.set_mode((500,500))

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
  
  def movement_up(self):
    pass
    #more boilerplate movement code

  def check_collision(player1,player2):
    check = pygame.sprite.collide_rect(player1,player2)
    if check == True:
      sys.exit()

enemy = Player(30,30,60,5)
person = Player(0,5)

game_loop = True
while game_loop == True:
  clock.tick(60)
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      game_loop = False

  keys = pygame.key.get_pressed()

  if keys[pygame.K_a]:
    #boilerplate movement code
    pass

  person.check_collision()  # <-- what to put here

  win.fill((0,0))
  pygame.draw.rect(win,(255,0),(person.x,person.y,person.width,person.height))
  pygame.draw.rect(win,(0,255),(enemy.x,enemy.y,enemy.width,enemy.height))
  pygame.display.update()

pygame.quit()

解决方法

你可以像person.check_collision(enemy)一样称呼它。但是它根本不起作用。


您不能使用 pygame.sprite.collide_rect,因为 player1player2 不是 pygame.sprite.Sprite 对象。但是,您可以创建 pygame.Rect 对象并使用 colliderect

class Player():
    # [...]

    def check_collision(self,enmey):
        self_rect = pygame.Rect(self.x,self.y,self.width,self.height)
        enmey_rect = pygame.Rect(enmey.x,enmey.y,enmey.width,enmey.height)
        if self_rect.cooliderect(enmey_rect):
            sys.exit()
enemy = Player(30,30,60,5)
person = Player(0,5)

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

    person.check_collision(enemy)

另见How do I detect collision in pygame?


您可以通过删除属性 xywidthheight 来大大简化您的代码,但添加一个属性 rect

class Player():
    def __init__(self,x,y,width,height,speed):
        self.rect = pygame.Rect(x,height)
        self.speed = speed
  
    def movement_up(self):
        pass
        #more boilerplate movement code

    def check_collision(self,enmey):
        if self.rect.colliderect(enmey.rect):
            sys.exit()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。