Именование Экземпляров MovieClips загружается динамически - PullRequest
0 голосов
/ 18 августа 2010

Я пытаюсь назвать экземпляры MovieClips, которые я динамически загружаю.

Я пытался сделать это:

comp = new Comp ();// и попытался это сделать -> var comp: MovieClip = new Comp ();
comp.name = "comp";// comp - это имя, которое я хочу, чтобы экземпляр был

НО в окне OUTPUT:

ReferenceError: Error #1056: Cannot create property comp on ToggleTest.
 at flash.display::Sprite/constructChildren()
 at flash.display::Sprite()
 at flash.display::MovieClip()
 at ToggleTest()

Это код, который есть в моем файле ActionScript:

    import flash.display.MovieClip;
     import flash.events.MouseEvent;
     import flash.events.Event;

 public class ToggleTest extends MovieClip
 {
  var comp:MovieClip;

  public function ToggleTest()
  {

   comp = new Comp();
   //var comp:MovieClip = new Comp();
   comp.name = "comp";

   comp.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
   comp.addEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
   comp.addEventListener(MouseEvent.CLICK, toggleClick);
   comp.bstate = 0;
   comp.buttonMode = true;

   // Add Movie Clip "buttons" to stage
   stage.addChild(comp);

   comp.x = 120;
   comp.y = 130;


   // calls function frameloop
   stage.addEventListener(Event.ENTER_FRAME, frameloop);

  }

  // function rolloverToggle
  function rolloverToggle(e:MouseEvent) {
   if (e.currentTarget.currentFrame == 1)
    e.currentTarget.gotoAndStop(2);
   if (e.currentTarget.currentFrame == 3)
    e.currentTarget.gotoAndStop(4);
  }

  // function rolloutToggle
  function rolloutToggle(e:MouseEvent) {
   if (e.currentTarget.currentFrame == 2)
    e.currentTarget.gotoAndStop(1);
   if (e.currentTarget.currentFrame == 4)
    e.currentTarget.gotoAndStop(3);
  }

  // function toggleClick
  function toggleClick(e:MouseEvent) {


   var houseArray:Object = {lightA: 1, 
         lightB: 1, 
         lightC: 1,
         lightD: 1,
         lightE: 1,
         comp: 2,
         tv: 3,
         stove: 4,
         laundry: 5};

   var powerData:int = houseArray[e.currentTarget.name.toLowerCase()];


  trace("movieClip Instance Name = " + e.currentTarget);
  trace(powerData);
  trace(houseArray[0]);

   // how to find out which object selected

   if (e.currentTarget.currentFrame == 2)
   {
    e.currentTarget.gotoAndStop(3);
    e.currentTarget.bstate = 1;
   }

   if (e.currentTarget.currentFrame == 4)
   {
    e.currentTarget.gotoAndStop(1);
    e.currentTarget.bstate = 0;
   }
  }

  function frameloop(e:Event)
  {
   var outtext:String="";
   outtext += comp.bstate +", ";
   outfield.text = outtext;

  }


 } 
}

Ответы [ 3 ]

0 голосов
/ 18 августа 2010

Вот некоторые потенциальные проблемы:

1) Я нигде не вижу оператора импорта для класса Comp.Это название Linkage для мувиклипа во флэш-памяти?В противном случае вам нужно будет его импортировать.

2) Поскольку вы находитесь в классе, когда вы создаете свойства для класса (в основном переменные, которые вы объявляете по определению класса, например, переменную comp), вам нужноиспользуйте общедоступное или личное ключевое слово.Поэтому вместо

var comp:MovieClip;

вы бы поставили:

private var comp:MovieClip;

3) Свойство name для DisplayObjects (comp.name) доступно только для чтения.Вам не разрешено его устанавливать.

4) Вы не можете получить доступ к сцене, пока ToggleTest не будет добавлен к ней.Поэтому добавьте слушатель для ADDED_TO_STAGE в конструкторе, а затем добавьте comp на сцену.Так как:

public function ToggleTest()
{
    addEventListener(Event.ADDED_TO_STAGE, _added);
}

private function _added(e:Event):void
{
    removeEventListener(Event.ADDED_TO_STAGE, _added);

    comp = new Comp();

    comp.addEventListener(MouseEvent.MOUSE_OVER, rolloverToggle);
    comp.addEventListener(MouseEvent.MOUSE_OUT, rolloutToggle);
    comp.addEventListener(MouseEvent.CLICK, toggleClick);
    comp.bstate = 0;
    comp.buttonMode = true;
    comp.x = 120;
    comp.y = 130;

    // Add Movie Clip "buttons" to stage
    stage.addChild(comp);

    // calls function frameloop
    stage.addEventListener(Event.ENTER_FRAME, frameloop);
}
0 голосов
/ 19 августа 2010

Я взял ваш код и попытался повторить ошибку, но все работало нормально!Вот что я сделал:

  • Создание нового проекта AS3 во Flash CS5
  • Создание класса документа с именем ToggleTest.as и копирование в него вашего кода
  • СозданиеMovieClip с именем Comp и установлен флажок «Экспорт для Actionscript» с именем класса Comp
  • Создан TextField с именем экземпляра outfield

Я не получил никаких ошибок, CompЭкземпляр был добавлен на сцену, и в дальней части поля отображался текст

После нажатия на Comp я получил следующие трассировочные операторы:

movieClip Instance Name = [object Comp]
2
undefined

undefined был возвращен из-за этого

trace(houseArray[0]);

houseArray - это объект, поэтому я изменил оператор trace на этот

trace(houseArray[e.currentTarget.name]);

, поэтому после нажатия кнопки Comp:

movieClip Instance Name = [object Comp]
2
2

Теперь я не понимаю ошибку, которую вы ''получаю.Если класс Comp не может быть найден, вы получите ошибку «Вызов возможно неопределенного метода Comp».

Кажется, проблема в другом месте, попробуйте сделать то же, что и выше, начните новый проект сминимальная настройка, вы не сможете воспроизвести ошибку, а затем добавлять новые элементы, пока ошибка не вернется

0 голосов
/ 18 августа 2010

Протестируйте тот же код со следующим:

    comp = new MovieClip();

, если он работает, вам может понадобиться импортировать класс Comp

...