我想以1-5秒的随机间隔将敌人催生到游戏中。为了防止程序中的游戏部分(移动角色等)在出现sleep
时暂停,我将整个代码分为2种方法,这样我可以有2个线程-一个设置{{1} }每1-5秒,另一个控制字符。
可悲的是,第二种方法在第一种方法中没有更改enemyspawn True
,或者线程输出了错误。我已经阅读并尝试了在if语句之前从enemyspawn
检索值,但是那没有用(或者我只是做错了)。我还尝试过将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
答案 0 :(得分:0)
在这种情况下,您不想从同一函数(递归函数)中调用函数。更好的方法可能是:
def spawn_enemy():
# code that makes an enemy
print("an enemy has been spawned")
return True # would be "return enemy" after you create your enemy entity
def EnemySpawnThread():
enemy_list = [] # to maintain records of all enemies made
while True: # make enemies forever
sleep(randint(1,5))
enemy_list.append(spawn_enemy()) # call our function we made above which spawns enemies
当前,这只会像[True, True, True, ...]
这样的列表,但是最终您可能会定义一个敌人类别,并且它将变成[enemy_object, enemy_object, ...]
,这是更可取的,因为我发现删除对象的最佳方法是将其存储在列表中,然后del enemy_list[index]
将其删除(例如,当敌人死亡时,它不再使用内存)。此外,它还使您可以像这样迭代:
for enemy in enemy_list:
enemy.move()
enemy.attack()
enemy.die()
这就是为什么您希望enemy
成为具有上述方法的类。
作为旁注,您可能希望将enemy_list
作为全局变量(或在您的主函数中),以便所有线程都可以访问它。否则,您将需要使用python标准实现内置的queue.Queue()
。