Actionscript 2.0函数问题和某种“全局”变量

时间:2010-05-29 14:00:23

标签: actionscript function actionscript-2 flash-cs4

我有两个问题。

第一个问题是以下功能;当我在(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时,它是“未定义的” ”

2 个答案:

答案 0 :(得分:0)

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访问它们。

答案 1 :(得分:0)

您可以将它放在_global上,而不是将值放在_root上。当你没有明确指定范围时,它/似乎/本地值(在函数/对象上)将覆盖_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);
}

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