【问题标题】:Why is variable not global in BGE Python为什么变量在 BGE Python 中不是全局变量
【发布时间】:2015-06-25 16:49:08
【问题描述】:

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

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

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

当我运行下面的代码时,我得到一个错误,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)

【问题讨论】:

    标签: python game-engine blender


    【解决方案1】:

    仅当您的第一个 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 语句是否为 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)
    

    【讨论】:

    • 我可能会采纳你的建议,但print('1') 函数仍会运行并打印出“1”。所以这意味着整个if 语句从一开始就被评估为True,因此,应该定义这两个变量。
    • 你的代码可能出错的唯一方法是 if if 最初评估为 False 除非你使用的任何版本的 python 的行为与我所见过的完全不同
    • 这让我很困惑,因为它总是打印出“1”,并且布尔属性设置为 True,我假设 if 函数运行然后将该属性设置为 false,所以它不会t 再次运行。后来我实际上发现该属性无论出于何种原因始终为 False,即使我明确将其设置为 True。但感谢您的建议。它更能防故障。
    • 不用担心,很高兴它有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多