我想在游戏中随机间隔1-5秒产生一个敌人。为了防止程序的游戏性部分(移动角色等)在有sleep
时暂停,我将整个代码分成了两个方法,这样我就可以有两个线程-一个线程每1-5秒设置enemyspawn True
,另一个线程控制角色
遗憾的是,要么第二个方法没有改变第一个方法中的enemyspawn
,要么线程输出一个错误。我已经阅读了if语句之前的EnemySpawn()
并尝试从中检索值,但没有成功(或者我只是做错了)。我还尝试将enemyspawn
转换为全局变量。什么都没变
def Gameplay():
width=80
height=80
y = 720/2+height/2
x = 720/2+width/2
speed=2
enemyspawn = False
while True:
#controll character here
if enemyspawn:
enemyspawn=False
print(enemyspawn) #Spawn enemy here later
window.blit(bg, [0,0])
pygame.draw.rect(window,(100,100,100),(x,y,width,height))
pygame.display.update()
def EnemySpawn():
enemyspawn = EnemySpawn() #idrk about this line
while True:
sleep(randint(1,5))
enemyspawn=True
print(enemyspawn)
return enemyspawn
Gameplay = threading.Thread(target=Gameplay)
Gameplay.start()
EnemySpawn = threading.Thread(target=EnemySpawn)
EnemySpawn.start()
线程错误消息:
line 51, in EnemySpawn
enemyspawn = Gameplay(enemyspawn)
UnboundLocalError: local variable 'enemyspawn' referenced before assignment
另一个错误消息:
line 51, in EnemySpawn
enemyspawn = EnemySpawn()
TypeError: 'Thread' object is not callable
在这种情况下,您不希望从同一个函数(递归函数)中调用函数。更好的方法可能是:
目前,这只会生成一个类似
[True, True, True, ...]
的列表,但最终您可能会定义一个敌方类,它将变成[enemy_object, enemy_object, ...]
,这是比较可取的,因为我发现删除对象的最好方法是将它们存储在列表中,然后del enemy_list[index]
删除它们(例如,当敌方死亡时,这样它就不会继续使用内存)。此外,它还提供了如下迭代功能:这就是为什么您希望
enemy
是一个具有如上所示方法的类顺便说一下,您可能希望将
enemy_list
作为全局变量(或在主函数中),以便所有线程都可以访问它。否则,您将需要用python实现queue.Queue()
内置标准相关问题 更多 >
编程相关推荐