为什么变量在 BGE 中不是全局变量 Python
Why is variable not global in BGE Python
我正在尝试使用 Python 控制器在 Blender Game Engine 中制作一个简单的游戏。
我有一个 Python 控制器以脉冲模式连接到 Always 传感器,还有一个名为 'first' 的游戏 属性 在 Sphere 上,它也是受控对象。
我想 运行 仅在第一次游戏 运行 时编写几行代码,这样它就定义了变量并且下次不会覆盖它们 运行s。
当我 运行 下面的代码出现错误时,未定义 ForBack
和 LeftRight
变量。但是我可以从 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)
我正在尝试使用 Python 控制器在 Blender Game Engine 中制作一个简单的游戏。
我有一个 Python 控制器以脉冲模式连接到 Always 传感器,还有一个名为 'first' 的游戏 属性 在 Sphere 上,它也是受控对象。
我想 运行 仅在第一次游戏 运行 时编写几行代码,这样它就定义了变量并且下次不会覆盖它们 运行s。
当我 运行 下面的代码出现错误时,未定义 ForBack
和 LeftRight
变量。但是我可以从 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)