如何为这个函数使用继承
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"
大家好,我是 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"