Python如何从不同的方法触发方法中的操作

2024-06-08 14:36:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想在游戏中随机间隔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

Tags: 方法true角色ifdef错误linesleep
1条回答
网友
1楼 · 发布于 2024-06-08 14:36:40

在这种情况下,您不希望从同一个函数(递归函数)中调用函数。更好的方法可能是:

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()内置标准

相关问题 更多 >