【问题标题】:Actionscript 2.0 Functions problem and somewhat "global" variableActionscript 2.0 函数问题和一些“全局”变量
【发布时间】:2011-02-25 11:49:46
【问题描述】:

我有两个问题。

第一个问题是以下函数;当我在(enterFrame)中调用该函数时,它不起作用:

onClipEvent (load) {

 function failwhale(levelNum) {
  _root.gotoAndStop("fail");
  failFrom = levelNum;
 }

 function guardSightCollision(guardName, guardSightName) {
  if (_root.guardName.guardSightName.hitTest(_x, _y+radius, true)) {
   failwhale(1);
  }
  if (_root.guardName.guardSightName.hitTest(_x, _y-radius, true)) {
   failwhale(1);
  }
  if (_root.guardName.guardSightName.hitTest(_x-radius, _y, true)) {
   failwhale(1);
  }
  if (_root.guardName.guardSightName.hitTest(_x+radius, _y, true)) {
   failwhale(1);
  }
 }
}
onClipEvent (enterFrame) {
 guardSightCollision(guard1, guard1Sight);
}

为什么它不起作用?...

第二个问题出在failFrom变量上:

function failwhale(levelNum) {
    _root.gotoAndStop("fail");
    failFrom = levelNum;
}

我如何使 failFrom 成为“全局”变量,因为它可以在任何地方访问(从帧中的动作脚本甚至电影剪辑)...现在,当我尝试在不同的帧中跟踪 failFrom 时,它是“未定义的”。

【问题讨论】:

    标签: actionscript function actionscript-2 flash-cs4


    【解决方案1】:

    除了将值放在 _root 上,您还可以将它放在 _global 上。当您没有明确指定范围时,它/似乎/本地值(在函数/对象中)将覆盖 _root,然后 _root 覆盖 _global。我看到各种东西都使用 _global 而不是 _root,但我不确定是否有任何真正的好处。

    如果你想在一个实例上定义你的函数,试试这个:

    onClipEvent (load) 
    {
     this.failwhale = function (levelNum) 
     {
       _root.gotoAndStop("fail");
       failFrom = levelNum;
     }
    
     this.guardSightCollision = function(guardName, guardSightName) 
     {
      if (_root.guardName.guardSightName.hitTest(_x, _y+radius, true)) 
      {
       failwhale(1);
      }
      if (_root.guardName.guardSightName.hitTest(_x, _y-radius, true)) 
      {
       failwhale(1);
      }
      if (_root.guardName.guardSightName.hitTest(_x-radius, _y, true)) 
      {
       failwhale(1);
      }
      if (_root.guardName.guardSightName.hitTest(_x+radius, _y, true)) 
      {
       failwhale(1);
      }
     }
    }
    onClipEvent (enterFrame) 
    {
      this.guardSightCollision(guard1, guard1Sight);
    }
    

    否则,您应该将它们放在父对象(或根时间轴)的时间轴上并引用对象方向,如:

     myobject.failwhale = function (levelNum) 
     {
       _root.gotoAndStop("fail");
       failFrom = levelNum;
     }
    
     myobject.guardSightCollision = function(guardName, guardSightName) 
     {
      if (_root.guardName.guardSightName.hitTest(_x, _y+radius, true)) 
      {
       failwhale(1);
      }
      if (_root.guardName.guardSightName.hitTest(_x, _y-radius, true)) 
      {
       failwhale(1);
      }
      if (_root.guardName.guardSightName.hitTest(_x-radius, _y, true)) 
      {
       failwhale(1);
      }
      if (_root.guardName.guardSightName.hitTest(_x+radius, _y, true)) 
      {
       failwhale(1);
      }
     }
    
    myobject.onEnterFrame = function()
    {
      this.guardSightCollision(guard1, guard1Sight);
    }
    

    另外,我强烈建议您输入变量/参数以进行编译错误检查和一些速度提升。

    【讨论】:

      【解决方案2】:

      failFrom 将在您跟踪它的任何其他地方“未定义”的原因是因为您只是在您在答案中添加的所有函数中本地声明它。如果您想像访问全局变量一样访问它,则必须将其分配给可以在任何地方访问的对象。像_root。

      function failwhale(levelNum) 
      {
          _root.failFrom = levelNum;
      }
      
      function anotherFunc()
      {
          trace( "failed on: " + _root.failFrom );
      }
      

      如果从脚本中的其他任何地方调用 anotherFunc,如果在调用 anotherFunc 之前已为其分配了任何内容,它应该正确打印出 failFrom。

      至于你的功能问题。看起来您正在尝试在事件处理程序中定义函数。通过使用 onClipEvent,看起来您正在将其添加到时间线中。如果是这种情况,您的 load 事件正在定义不再可用于 on enter frame 事件的本地函数。只需要始终定义您的辅助函数:

      function failwhale(levelNum) 
      {
          //...
      }
      
      function guardSightCollision(guardName, guardSightName) 
      {
          //...
      }
      
      onClipEvent (enterFrame) 
      {
          guardSightCollision(guard1, guard1Sight);
      }
      

      由于您添加的函数都与剪辑事件在同一范围内,因此它们应该可以从 enterFrame 访问。

      【讨论】:

      • 感谢您对 _root 变量的建议!但是,至于功能,你的建议给了我一个编译错误。当我第一次创建这些函数时,我使用任何 onClipEvent 处理程序来制作它们。但是,编译器给了我一个错误,并说我必须在 onClipEvent 处理程序中包含这些函数。我试过把它放在 (event) 和 (load) 都不管用。
      猜你喜欢
      • 2016-03-18
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2011-01-25
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多