在另一个类中使用来自一个类的方法?

2024-05-12 21:44:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试为我的游戏创建两个精灵,一个是Player1,另一个是Player2,因此它们的属性非常相似。我正在尝试解决如何将我的Player1类的所有方法与我的Player2类一起使用

class Player2(pygame.sprite.Sprite):
  def __init__(self):
      Player1.__init__(self)
      self.rect.x = 400
      self.walkImages = ["p2 walk/Run (1).png", "p2 walk/Run (2).png", "p2 walk/Run (3).png", "p2 walk/Run (4).png", "p2 walk/Run (5).png", "p2 walk/Run (6).png", "p2 walk/Run (7).png",
                         "p2 walk/Run (8).png"]

      self.idleImages = ["p2 idle/Idle (1).png", "p2 idle/Idle (2).png", "p2 idle/Idle (3).png", "p2 idle/Idle (4).png", "p2 idle/Idle (5).png", "p2 idle/Idle (6).png", "p2 idle/Idle (7).png",
                         "p2 idle/Idle (8).png", "p2 idle/Idle (9).png", "p2 idle/Idle (10).png"]

  def update(Player1, blocksGroup):
      pass

创建Player2类时,我从Player1继承。然而,在我的update方法中,理论上它与Player1是相同的。如何使用Player1的方法进行更新

以下是Player1的更新方法:

  def update(self, blocksGroup):
    self.gravity()

    if self.velx == 0:
        self.walkFrame = 1
        self.idleFrame += 1
        if self.idleFrame == 42:
            self.idleFrame = 0

        if self.idleFrame % 3 == 0:
            self.image = pygame.image.load(self.idleImages[self.idleFrame // 3])
            if self.direction == "left":
                self.image = pg.transform.flip(self.image, True, False)


    #Block collision

    self.rect.x += self.velx
    block_hit_list = pygame.sprite.spritecollide(self, blocksGroup, False)
    for block in block_hit_list:
        if self.velx > 0:
            self.rect.right = block.rect.left
        elif self.velx < 0:
            self.rect.left = block.rect.right

    self.rect.y += self.vely
    block_hit_list = pygame.sprite.spritecollide(self, blocksGroup, False)
    for block in block_hit_list:
        if self.vely > 0:
            self.rect.bottom = block.rect.top
            self.jumps = 2
        elif self.vely < 0:
            self.rect.top = block.rect.bottom

Tags: 方法runrectselfifpngblockpygame
2条回答

您还没有真正说明Player1Player2类是如何不同的,但是假设您有充分的理由,我建议您创建一个名为PlayerBase的基类,并将其用作这两个其他类的基类

这将非常清楚地表明它们共享行为,并且只需要在每个子类的方法中实现差异

我之所以说“假设你有充分的理由”拥有两个类,是因为如果它们之间的唯一区别是它们包含什么样的数据,例如,您不需要有两个类来实现这一点,只需定义(单个)类的__init__()方法,这样它就可以接受提供此数据的参数,然后在必要时通过默认情况下传递给所有常规方法的self参数将其存储为类实例数据

维基百科关于Object-oriented Programming (OOP)的文章中有一个标题为Objects and classes的部分,讨论了两者之间的区别,这可能会让你更深入地了解什么时候应该使用其中一个来做事情

如果Player2Player1继承,并且update方法完全相同,那么就不能为Player2定义update

在这种情况下,当updatePlayer2对象调用时,它将使用从Player1继承的定义,self将引用Player2实例

相关问题 更多 >