Python-如何从其他方法触发方法中的操作

时间:2019-05-23 16:07:08

标签: python multithreading methods pygame switch-statement

我想以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

1 个答案:

答案 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()