Actionscript 2.0: проблема функций и несколько «глобальная» переменная - PullRequest
0 голосов
/ 29 мая 2010

У меня две проблемы.

Первая проблема связана со следующими функциями; когда я вызываю функцию в (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 из «глобальной» переменной, чтобы к ней можно было получить доступ где угодно (из ActionScript в кадрах и даже в мувиклипах) ... Прямо сейчас, когда я пытаюсь отследить failFrom в другом кадре, он «неопределен» ».

Ответы [ 2 ]

0 голосов
/ 05 апреля 2011

Вместо установки значения на _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);
}

Кроме того, я бы настоятельно рекомендовал вводить ваши переменные / аргументы как для проверки ошибок компиляции, так и для некоторого увеличения скорости.

0 голосов
/ 01 июня 2010

Причина, по которой failFrom будет "неопределенной" из любой точки, где вы ее отслеживаете, заключается в том, что вы объявляете ее только локально во всех функциях, добавленных в ответе. Если вы хотите получить к нему доступ как к глобальной переменной, вы должны назначить ее объекту, к которому можно получить доступ где угодно. Как _root.

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

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

Если в любом месте вашего скрипта вызывается anotherFunc, он должен правильно распечатать failFrom, если ему было назначено что-либо еще до вызова anotherFunc.

Что касается вашей функции. Похоже, вы пытаетесь определить функции внутри обработчика событий. Похоже, что при использовании onClipEvent вы добавляете это на временную шкалу. Если это так, то ваше событие загрузки определяет локальные функции, которые больше не доступны для события on enter frame. Просто необходимо, чтобы ваши вспомогательные функции были всегда определены:

function failwhale(levelNum) 
{
    //...
}

function guardSightCollision(guardName, guardSightName) 
{
    //...
}

onClipEvent (enterFrame) 
{
    guardSightCollision(guard1, guard1Sight);
}

Поскольку все добавленные вами функции находятся в той же области действия, что и событие clip, они должны быть доступны из enterFrame.

...