我在这里以及其他网站上阅读了一些关于如何覆盖功能的内容,但它们都不符合我的需求。
我只需要更改一行代码,因此使用super(Class, self).function(parameter)
似乎没有帮助。我可能完全错了。
无论如何,这是父母:
class Platformer(Entity):
def __init__(self, color, width, height, x, y):
Entity.__init__(self)
pygame.sprite.Sprite.__init__(self)
self.image = pygame.Surface([width, height])
self.image.fill(color)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.xvel = 0
self.yvel = 0
self.onGround = False
def update(self, up, down, left, right, platforms):
if up:
if self.onGround:
self.yvel -= 8
bounceSound.play()
if down:
self.yvel += 5
if left:
self.xvel = -3
if right:
self.xvel = 3
if not self.onGround:
self.yvel += 0.5
if self.yvel > 15:
self.yvel = 15
if not(left or right):
if self.onGround:
self.xvel = 0
self.rect.left += self.xvel
self.collide(self.xvel, 0, platforms)
self.rect.top += self.yvel
self.onGround = False
self.collide(0, self.yvel, platforms)
def collide(self, xvel, yvel, plats):
for p in platforms:
if sprite.collide_rect(self, p) and isinstance(p, Block):
if xvel > 0:
self.rect.right = p.rect.left
if xvel < 0:
self.rect.left = p.rect.right
if yvel > 0:
self.rect.bottom = p.rect.top
self.onGround = True
self.yvel = 0
if yvel < 0:
self.rect.top = p.rect.bottom
self.yvel = 0
这就是我写的那个孩子:
class Bird(Platformer):
def update(self, up, down, left, right, platforms):
if up:
self.yvel -= 8
if down:
self.yvel += 5
if left:
self.xvel = -3
if right:
self.xvel = 3
if not self.onGround:
self.yvel += 0.5
if self.yvel > 15:
self.yvel = 15
if not(left or right):
if self.onGround:
self.xvel = 0
请注意,我想要更改的是if
“up”部分中的update
语句。
在运行程序时,一切正常(鸟在需要的地方绘制,正确的颜色等),但更新不起作用。
有人可以帮我理解这个吗?我真的找不到合适的语法。
答案 0 :(得分:0)
我会改变结构如下:
在父级中添加额外参数parentBehaviour
:
def update(self, up, down, left, right, platforms, parentBehaviour=True):
if up:
if parentBehaviour and self.onGround:
self.yvel -= 8
bounceSound.play()
#rest of method...
在孩子身上:
def update(self, up, down, left, right, platforms):
super(Bird, self).update(up, down, left, right, platforms, False)
#end method
此结构的原因通常是您通常希望避免复制您的代码。请参阅Wikipedia了解DRY principle。