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

Why is variable not global in BGE Python

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

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

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

当我 运行 下面的代码出现错误时,未定义 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)

只有当您的第一个 if 语句的计算结果为 True 时,它们才会被定义。您每次访问所有 if 语句,这些语句每次都在 player.applyTorque((ForBack, LeftRight, 0), False).

中评估

您应该为第一个 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 语句是否为真,则需要将 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)