【问题标题】:My variable, when created in an if statement only exist when the if statement is true我的变量,在 if 语句中创建时,仅在 if 语句为 true 时才存在
【发布时间】:2014-01-07 04:44:42
【问题描述】:

我正在为游戏创建代码,当您的鼠标悬停在敌人上方并点击敌人时,您的角色会追逐敌人。因此,我将敌人创建为变量,因为如果单击的只是任意对象,我不希望角色追逐敌人。然后代码检查属性“enemy”是否在单击的对象内,如果是,则该对象追逐该对象。

if click.positive:
    obj = mouse.hitObject
    if 'enemy' in obj:
        own['attack'] = 1
    else:
        own['attack'] = 0

当 own['attack'] = 1 时,玩家追逐敌人,但是编译器说 obj 不存在。但是,它在最初单击鼠标时确实存在,但之后不存在。我知道该变量仅在单击鼠标时才存在,因为如果未单击鼠标,则它永远不会分配变量。但是我怎么能纠正它,如果敌人被点击一次,玩家将继续追逐敌人,直到点击其他东西?

这是我遇到的错误

NameError: global name 'obj' is not defined

如果您想通读一遍,这就是整个代码,它也是在搅拌机中编码的,如“import bge”所示:

import bge
cont = bge.logic.getCurrentController()
own = cont.owner
scene = bge.logic.getCurrentScene()

flagEmpty = scene.objects['Flag Empty']
flag = scene.objects['Flag']
enemy = scene.objects['Enemy Physics Box']

mouse = cont.sensors[1]
click = cont.sensors[0]

track = cont.actuators[0]
message = cont.actuators[1]
blur = cont.actuators[2]

hit = mouse.hitPosition
distance = own.getDistanceTo(flagEmpty)
enemyDistance = own.getDistanceTo(enemy)

if 'init' not in own:
    own['init'] = True
    own['fric'] = .85
    own['maxspd'] = 5
    own['speed'] = 0.0
    own['accel'] = .2
    own['attack'] = obj

def main():
    if click.positive:
        global obj
        obj = mouse.hitObject
        if 'enemy' in obj:
            own['attack'] = obj
        if 'enemy' not in obj:
            own['attack'] = obj
    if own['attack'] == obj:
         attack()
    if own['attack'] == None:
         free()
def free():
    if own['attack'] == None:
        cont.deactivate(blur)
    if click.positive:
        if hit.z < -.34:
            if hit.z > -.36:
                flagEmpty.position = hit

    if distance > 1:
        own['speed'] += own['accel']
        cont.activate(message)
        cont.activate(track)
        flag.visible = True
    else:
        own['speed'] *= own['fric']
        cont.deactivate(track)
        cont.deactivate(message)
        flag.visible = False
    speed()
def attack():
    enemyDist = own.getDistanceTo(obj)
    if own['attack'] == obj:
        cont.activate(blur)
        blur.object = obj
    if enemyDist > 1.2:
        own['speed'] += own['accel']
        cont.activate(message)
    else:
        own['speed'] *= own['fric']
        cont.deactivate(message) 

    speed()
def speed():
    if own['speed'] > own['maxspd']:
        own['speed'] = own['maxspd']

    own.setLinearVelocity([0,own['speed'],0], True)
main()

【问题讨论】:

  • 您将不得不包含更多相关代码。可能是错误消息的实际回溯?
  • 这可能是几个可能的错误中的任何一个。我们无法从显示的代码片段中分辨出来。
  • 您确定编译器抱怨的是obj,而不是own

标签: python variables if-statement


【解决方案1】:

你可以这样做:

if 'enemy' in obj:
    own['attack'] = obj

并在没有敌人受到攻击时设置own['attack'] = None

【讨论】:

    【解决方案2】:

    当您调用此代码时:

    def main():
        if click.positive:
            global obj
            obj = mouse.hitObject
            if 'enemy' in obj:
                own['attack'] = obj
            if 'enemy' not in obj:
                own['attack'] = obj
        if own['attack'] == obj:
             attack()
        if own['attack'] == None:
             free()
    

    您将在每次循环中将own['attack']obj 进行比较。 第一次通过循环,obj 不会被定义,会抛出错误。一个简单的更改是在鼠标点击之外声明global obj,如下所示:

    def main():
        global obj
        if click.positive:
            obj = mouse.hitObject
            if 'enemy' in obj:
                own['attack'] = obj
            if 'enemy' not in obj:
                own['attack'] = obj
        if own['attack'] == obj:
             attack()
        if own['attack'] == None:
             free()
    

    【讨论】:

      【解决方案3】:

      obj 未设置在全局范围内。我看到contownsceneflagEmptyflagenemymouseclick,@9876543@30@,blurblurblurblur distanceenemyDistance,但不是 obj。我试了你的代码,刚放的时候警告就消失了

      obj = None
      

      if 'init' not in own: 之前的某个地方。

      -Q

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多