为什么变量在BGE Python中不是全局的

时间:2015-04-18 21:05:31

标签: python game-engine blender

我正在尝试使用Python控制器在Blender Game Engine中制作一个简单的游戏。

我有一个Python控制器连接到脉冲模式的Always传感器和Sphere上称为'first'的游戏属性,它也是受控对象。

我想仅在游戏第一次运行时运行几行代码,这样才能定义变量,并且下次运行时不会覆盖它们。

当我运行下面的代码时,我收到一个错误,即ForBackLeftRight变量未定义。但是我可以在if语句中访问它们。

我错过了一些明显或者什么?如果我可以压缩这段代码,也请告诉我。

import bge
from bge import logic

cont = bge.logic.getCurrentController()
player = cont.owner
keyboard = bge.logic.keyboard
scene = logic.getCurrentScene()
objs = scene.objects
ACTIVE = bge.logic.KX_INPUT_ACTIVE
first = objs['Sphere']['first']

if(first == True):
    ForBack = 0.0
    LeftRight = 0.0
    print('1')
    print(ForBack)
    objs['Sphere']['first'] = False

if (keyboard.events[bge.events.WKEY] == ACTIVE and ForBack < 50):
    ForBack += 5
    #forward   
if (keyboard.events[bge.events.SKEY] == ACTIVE and ForBack > -50):
    ForBack -= 5
    #backward
if (keyboard.events[bge.events.AKEY] == ACTIVE and LeftRight < 50):        
    LeftRight += 5
    #left
if (keyboard.events[bge.events.DKEY] == ACTIVE and LeftRight > -50):
    LeftRight -=5
    #right

player.applyTorque((ForBack, LeftRight, 0), False)

1 个答案:

答案 0 :(得分:1)

只有在您的第一个if语句求值为True时才会定义它们。您每次都可以访问player.applyTorque((ForBack, LeftRight, 0), False)中每次评估的所有if语句。

您应该为外部设置第一个if语句的初始值。

ForBack = 0.0
LeftRight = 0.0

if first: 
   ........

发生的事情很清楚:

if(first == True): # evaluates to false first time
    ForBack = 0.0
    LeftRight = 0.0
    print('1')
    print(ForBack)
    objs['Sphere']['first'] = False

# then you get here and ForBack is not defined
if (keyboard.events[bge.events.WKEY] == ACTIVE and ForBack < 50):
                                                    ^^^^^^

如果您只希望其他人评估初始if语句是否为True,则需要将if嵌套在初始if中。

if first == True:
    ForBack = 0.0
    LeftRight = 0.0
    print('1')
    print(ForBack)
    objs['Sphere']['first'] = False

    if (keyboard.events[bge.events.WKEY] == ACTIVE and ForBack < 50):
        ForBack += 5
        #forward   
    if (keyboard.events[bge.events.SKEY] == ACTIVE and ForBack > -50):
        ForBack -= 5
        #backward
    if (keyboard.events[bge.events.AKEY] == ACTIVE and LeftRight < 50):        
        LeftRight += 5
        #left
    if (keyboard.events[bge.events.DKEY] == ACTIVE and LeftRight > -50):
        LeftRight -=5
        #right

    player.applyTorque((ForBack, LeftRight, 0), False)
相关问题