我正在尝试使用Python控制器在Blender Game Engine中制作一个简单的游戏。
我有一个Python控制器连接到脉冲模式的Always传感器和Sphere上称为'first'的游戏属性,它也是受控对象。
我想仅在游戏第一次运行时运行几行代码,这样才能定义变量,并且下次运行时不会覆盖它们。
当我运行下面的代码时,我收到一个错误,即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)
答案 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)