如何为这个函数使用继承

How to use inheritance for this function

大家好,我是 Python 的新人,这是我第一次 post 来这里! 我正在使用街机库创建一个小游戏。其中一种称为 draw 的方法用于在屏幕上显示游戏图像,并且效果很好。但是,我在不同的文件中重复使用它并重复相同的代码,所以我试图找到一种使用继承的方法。 这是我的 parent class FlyingObject:

class FlyingObject(ABC):
    def __init__(self):
        # object location is Point()
        self.center = Point()
        self.velocity = Velocity()
        self.alive = True
        # self.img = img
        # self.texture = arcade.load_texture(self.img)
        # self.width = self.texture.width
        # self.height = self.texture.height
        self.radius = SHIP_RADIUS
        self.angle = 0
        self.speed = 0
        self.direction = 0

    def draw(self):
        pass

    def is_alive(self):
        return self.alive

    def advance(self):
        self.wrap()
        self.center.y += self.velocity.dy
        self.center.x += self.velocity.dx

    def wrap(self):
        # wraps the objects on the screen
        if self.center.x > SCREEN_WIDTH:
            self.center.x -= SCREEN_WIDTH
        if self.center.x < 0:
            self.center.x += SCREEN_WIDTH
        if self.center.y > SCREEN_HEIGHT:
            self.center.y -= SCREEN_HEIGHT
        if self.center.y < 0:
            self.center.y += SCREEN_HEIGHT

还有 child class 中的一个名为 Bullet:

class Bullet(FlyingObject):
    def __init__(self, ship_angle, ship_x, ship_y, img):
        super().__init__()
        self.radius = BULLET_RADIUS
        self.life = BULLET_LIFE
        self.speed = BULLET_SPEED
        self.angle = ship_angle - 90
        self.center.x = ship_x
        self.center.y = ship_y
    
        bulletShot = Bullet("")
        bulletShot.draw(self)

    def fire(self):
        self.velocity.dx -= math.sin(
            math.radians(self.angle + 90)) * BULLET_SPEED
        self.velocity.dy += math.cos(
            math.radians(self.angle + 90)) * BULLET_SPEED

    def draw(self):
        img = "images/laser.png"
        texture = arcade.load_texture(img)

        width = texture.width
        height = texture.height
        alpha = 255  # For transparency, 1 means transparent

        x = self.center.x
        y = self.center.y
        angle = self.angle

        arcade.draw_texture_rectangle(x, y, width, height, texture, angle,
                                      alpha)

    def advance(self):
        super().advance()
        self.life -= 1
        if self.life <= 0:
            self.alive = False

所以draw()方法在不同模块中的使用方式相同,只是图片不同而已。我假设我应该移动 FlyingObject() 中的 draw() 方法以便我可以继承它。我怎样才能做到这一点?

确切地说,您将 draw 方法移动(覆盖)到 FlyingObject 中并传递参数 img:

def draw(self, img):

或者另一种选择,你移动 draw 方法,然后你将 img 作为 class 的参数放在 init 方法中:

def draw(self): # in FlyingObject
    img = self.img

并且:

def __init__(self, ship_angle, ship_x, ship_y, img):
    super().__init__()
    self.img = "images/laser.png"