问题描述
我正在 Pygame 中编写我的第一个游戏,我创建了一个敌人创建函数,以便在给定坐标之间调用这个敌人。 (在while循环内调用)
def foot_function(x_1,x_2,y_foot):
global x
global rubbish_2
global rubbish_3
global rubbish_4
steps = int((x_2 - x_1) / 3) # numbers of steps between x_1 and x_2
if rubbish_3:
rubbish_2 += 1
if not rubbish_3:
rubbish_2 -= 1
if rubbish_2 >= steps:
rubbish_3 = not rubbish_3
rubbish_4 = 'right'
if rubbish_2 < 0:
rubbish_3 = not rubbish_3
rubbish_4 = 'left'
if rubbish_4 == 'right':
window.blit(foot_right,(x_1 + 3 * rubbish_2 - x,y_foot))
if rubbish_4 == 'left':
window.blit(foot_left,y_foot))
death_function(x_1 + 3 * rubbish_2 + 5,y_foot + 5,90,90)
问题是因为我在这个函数中使用了全局变量;如果我再次尝试调用此函数,尽管我给了他们不同的输入,但 2 个敌人会做相同的动作。
我该如何解决这个问题?提前致谢。
解决方法
如果我理解你的问题,你正在尝试编写一个有状态的更新函数而不保持全局状态。我知道有两种方法可以稍微理智地做到这一点。
类
您基本上可以对全局变量执行相同的操作,但处于存储在对象中的状态。例如,这允许您同时运行两个独立的 FootClass
对象。
class FootClass():
def __init__(self,x_1,x_2):
self.x_1 = x_1
self.x_2 = x_2
def move(self,dx_1,dx_2):
self.x_1 += dx_1
self.x_2 += dx_2
...
功能性
第二种方法是让正在运行的东西保持状态,然后写一个更新函数。
def move_func(x_1,x_2,dx_2):
return (x_1 + dx_1,x_2 + dx_2)
def game():
init = (1,2)
while not_dead():
init = move_func(*init,2,5)
这是一个奇怪的例子,因为我不太了解您具体要做什么,但这是总体思路。