我在Pygame Sprite子类中有一个方法,定义如下:
def walk(self):
"""move across screen"""
displacement = self.rect.move((self.move, 0))
if self.rect.left < self.area.left or self.rect.right > self.area.right:
self.move = -self.move
displacement = self.rect.move((self.move, 0))
self.rect = displacement
我修改了它,添加了一个参数speed_x
,现在程序坏了。
def walk(self, speed_x):
"""move across screen"""
displacement = self.rect.move((speed_x, 0))
if self.rect.left < self.area.left or self.rect.right > self.area.right:
speed_x = -speed_x
displacement = self.rect.move((speed_x, 0))
self.rect = displacement
在我调用这样的方法之前:
def update(self):
self.walk()
现在我做了:
def update(self):
self.walk(self.move)
为什么这不起作用?
答案 0 :(得分:3)
你没有解释它是如何“破碎”的,但主要区别在于
speed_x = -speed_x
您在第二个版本中的仅更改 local 变量(参数是局部变量!)speed_x
,因此更改后的值不会保留。
在第一个版本中,
self.move = -self.move
确实改变了self
(特别是其中一个attriubtes),并且对将来作为self
访问的对象的未来方法调用中的“更改”仍然存在。
裸名称(例如speed_x
)和限定名称(行self.move
)之间的众多关键差异中的一个,而且,我怀疑,这里有什么东西咬你(很难你可能会这样做)不要说如何第二个版本没有达到你的期望。)
答案 1 :(得分:1)
你不会将偏移量存回到self.move。
答案 2 :(得分:1)
如果您想使用代码的第二个版本,请尝试添加以下行:
self.move = speed_x
在你的功能的底部。
答案 3 :(得分:1)
正如其他人所说,您并未在新代码中更改self.move
的值。我假设您修改此函数的原因是您可以将此函数重用于self.move
以外的值。
如果您希望能够将不同的参数传递给您的函数并进行修改,您可以将修改后的speed_x
值作为返回值传递回来:
def walk(self, speed_x):
"""move across screen"""
displacement = self.rect.move((speed_x, 0))
if self.rect.left < self.area.left or self.rect.right > self.area.right:
speed_x = -speed_x
displacement = self.rect.move((speed_x, 0))
self.rect = displacement
return speed_x
并将此函数调用为:
def update(self):
self.move = self.walk(self.move)
注意:此答案假定在调用self.move
时不应始终更新walk
。如果这个假设是假的,并且每次self.move
运行时walk
实际上应该更新,那么你应该使用Xavier Ho的答案。