Проблема с функциями Actionscript 2.0 и несколько глобальная переменная

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

Первая проблема связана со следующими функциями; когда я вызываю функцию в (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 в другом кадре, она "не определена".


person Joshua    schedule 29.05.2010    source источник


Ответы (2)


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

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

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

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

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

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

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

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

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

person Chuck    schedule 01.06.2010
comment
Спасибо за ваши предложения по переменной _root! Но что касается функций, ваше предложение дает мне ошибку компиляции. Когда я впервые создал эти функции, я сделал их из любых обработчиков onClipEvent. Однако компилятор выдал мне ошибку и сказал, что эти функции должны быть внутри обработчика onClipEvent. Я пытался поместить его в (событие) и (загрузить), но это не сработало. - person Joshua; 02.06.2010

Вместо того, чтобы помещать значение в _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);
}

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

person Mark Ribau    schedule 04.04.2011