【问题标题】:Pygame giving me a error when a bullet hits an enemy [duplicate]当子弹击中敌人时Pygame给我一个错误[重复]
【发布时间】:2021-08-31 11:44:31
【问题描述】:

我正在制作一个坦克游戏,你可以向其他坦克发射子弹。但是当你的子弹击中敌人时,我会收到这样的错误:

Traceback (most recent call last):
  File "...", line 182, in <module>
    if pygame.sprite.spritecollide(i, enemy_group, True):
  File "...\pygame\sprite.py", line 1645, in spritecollide
    default_sprite_collide_func = sprite.rect.colliderect
AttributeError: 'Bullet' object has no attribute 'rect'

这是我的代码中的问题,还是 pygame 中的问题?

这是子弹类:(顺便说一下,它重载了弹丸类)

class Bullet(Projectile):
    def __init__(self, *, screen, image):
        Projectile.__init__(self)

        self._screen = screen
        self._x = tank.get("x") + 90
        self._y = tank.get("y") - 7
        self._image = pygame.image.load(image)
        self._rect = self._image.get_rect()

    def update(self, speed):
        if self._x >= 800 or self._x <= 0:
            self.kill()

        self._x += speed
        self._rect.center = (self._x, self._y)

    def blit_on_screen(self):
        self._screen.blit(self._image, self._rect)

(弹丸类只是一个抽象方法等待被子弹类重载的类。)

而且,这里是敌人类:

class Enemy(pygame.sprite.Sprite):
    def __init__(self, *, screen, x, y):
        pygame.sprite.Sprite.__init__(self)

        self._screen = screen
        self._x = x
        self._y = y

        self._image = pygame.image.load("assets/Tank.png")
        self._image = pygame.transform.flip(self._image, True, False)
        self._image = pygame.transform.scale(self._image, (490, 280))

        self._rect = self._image.get_rect()

    def update(self, speed):
        if self._x <= 0 or self._x >= 800:
            self.kill()

        self._x -= speed
        self._rect.center = (self._x, self._y)

    def blit_on_screen(self):
        self._screen.blit(self._image, self._rect)

这是检查碰撞的子弹和敌人的部分:

    for i in bullet_group:
        if pygame.sprite.spritecollide(i, enemy_group, True):
            logging.info("bullet and enemy collided")

这里发生了什么?

【问题讨论】:

  • 请提供minimal reproducible example,而不是您的整个程序。 Stack Overflow 不是免费的代码调试服务(因为您可以确定问题出在您的代码上)。

标签: python pygame attributes attributeerror python-3.8


【解决方案1】:

pygame.sprite.spritecollide使用.rect属性来检测碰撞。查看pygame.sprite.spritecollide

的文档

[...]如果碰撞未通过,则所有精灵必须具有“矩形”值,这是精灵区域的矩形,将用于计算碰撞。

因此,您必须命名属性rect而不是_rect
class Bullet(Projectile):
    def __init__(self, *, screen, image):
        # [...]      
  
        self.rect = self._image.get_rect()
class Enemy(pygame.sprite.Sprite):
    def __init__(self, *, screen, x, y):
        # [...]

        self.rect = self._image.get_rect()

另外,您可以为碰撞检测创建自己的功能。将函数传递给可选的collided参数:

def my_collide(a, b):
    return a._rect.colliderect(b._rect)
if pygame.sprite.spritecollide(i, enemy_group, True, collided = my_collide):
    # [...]

【讨论】:

  • 哦,谢谢!我的解决方案是创建自己的检测碰撞方式,就像在Bullet_Group中的子弹一样:python for enemy in enemy_group: if bullet.get("rect").centerx &lt;= enemy.get("rect").midleft[0]: bullet.kill() enemy.kill() 以这种方式,我不必重命名self._rect self.rect仍然,谢谢! span>
  • @ alanbagel这是一个非常糟糕的解决方案。您希望创建自己的碰撞检测功能并将其传递给collided参数。 span>
  • 哇,我不知道你可以通过collided参数!谢谢!
  • @ alanbagel我已经扩展了答案。 span>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多