Flash CS5 ссылается на экранный объект из класса, отличного от класса документа - PullRequest
2 голосов
/ 29 июля 2011

Используя Flash CS5 Professional, я создал символ, перетащил его на сцену и присвоил ему имя экземпляра GreenLight1. Если я хочу сделать это видимым из класса документа, я могу просто сделать GreenLight1.visible = true; и да, это хорошо, когда я проверяю файл. Пока я остаюсь в классе документа, мне хорошо идти, но сейчас я пытаюсь перейти в другой класс и сталкиваюсь с ВСЕМИ видами проблем, просто пытаясь заставить Flash позволить мне получить доступ к этому простому объекту. Все, что я хочу сделать, это сделать этот GreenLight1 невидимым (visible = false), когда в этом новом классе возникает определенное условие, и Flash просто не позволяет мне получить доступ к GreenLight1 вообще.

То, что я пробовал до сих пор:

  1. Этап передается классу и на него ссылается _stage, и он отлично работает, когда я делаю _stage.addchild или что-то в этом роде. Поэтому я попытался "_stage.GreenLight1.visible = false;" и я получаю «ReferenceError: Ошибка № 1069: свойство GreenLight1 не найдено на flash.display.Stage и значение по умолчанию отсутствует.»

  2. Мой класс документов расширяет Sprite, поэтому я решил попробовать корневую функцию. Поэтому я попытался "Sprite (root) .GreenLight1.visible = false;" и я получаю "1119: доступ к возможно неопределенному свойству GreenLight1 через ссылку со статическим типом flash.display: Sprite."

  3. Наконец, по совету ответа в этой теме Я попытался создать класс Resource, как описано в нем. С которой я столкнулся с той же проблемой, с которой начал, так как он не знает, что такое GreenLight1, поэтому я получил «1120: доступ к неопределенному свойству GreenLight1». Вот мой код для Resource.as (я должен передать что-то этому классу из класса документа?):

`

package {

import flash.events.Event;
import flash.display.Sprite;
import flash.display.DisplayObject;

public class Resource extends Sprite {
    public static var GL1:GreenLight;

    public function Resource() {
        addEventListener(Event.ADDED_TO_STAGE, init, false, 0, true);
    }

    private function init(e:Event):void{
        Resource.GL1 = GreenLight1;
    }
}

}

Тип "GreenLight" относится к исходному символу GreenLight1. Я "Экспорт для ActionScript" отмечен, и базовый класс называется GreenLight. Так вот откуда это. Я должен сделать "новый GreenLight" где-нибудь или что-то в этом роде? В классе, к которому я пытаюсь получить доступ, я использую Resource.GL1.visible = false;, но на самом деле никогда об этом не беспокоиться, потому что я получаю ошибку компиляции, указанную в # 3 выше.

В любом случае, я не знаю, что делать дальше. Итак ... Как в мире я могу получить класс, который не является классом документа, для распознавания GreenLight1?

Ответы [ 2 ]

2 голосов
/ 29 июля 2011

1 не работает, потому что свойство stage объекта (при условии, что оно отображается) является объектом Stage.По умолчанию ваш класс документов будет первым дочерним элементом этапа, если вы не вставили туда что-либо, используя setChildIndex(0) или addChildAt(someObject,0).Таким образом, вы должны иметь возможность доступа через класс документа с

this.stage.getChildAt(0).GreenLight1;

2 не работает, потому что вы используете свой корень как Sprite.Это не Sprite, это ваш класс документов, который является потомком Sprite, так что это должно работать:

this.root.GreenLight1

Я собираюсь пропустить номер три и попытаться предложить более прямойрешение.У вас есть этот символ в вашей библиотеке, вы установили для него «Экспорт для ActionScript» и дали ему имя класса GreenLight.Хорошее начало.Так что теперь в любом месте вашего кода вы можете сделать что-то вроде этого:

var myGreenLight:GreenLight = new GreenLight();

, который создал ссылку (myGreenLight) на новый экземпляр вашего символа GreenLight.Теперь вы можете присоединить это к дереву отображения вашего вызывающего класса с помощью

addChild(myGreenLight);

Если предположить, что класс, в котором вы кодируете, сам находится на сцене, то ваш экземпляр GreenLight должен быть видимым.Вы также можете из любого объекта, находящегося на сцене, вызвать this.stage.addChild(myGreenLight);, чтобы прикрепить экземпляр GreenLight непосредственно к сцене, если это было то, что вы хотели.

Итак, наконец, реальный вопрос.У вас есть экземпляр GreenLight на сцене под названием GreenLight1.(Обратите внимание, что по соглашению только имена классов начинаются с заглавной буквы, имена переменных и экземпляров должны начинаться со строчной буквы).У вас есть другой класс, который также находится в дереве отображения, и вам нужно получить ссылку на GreenLight1, которая находится на сцене.Вот функция для этого:

function getMovieClip($instanceName:String,$scope:DisplayObjectContainer):DisplayObject
{
    var child:DisplayObject;
    var loopLength:int = $scope.numChildren;
    for(var i:int = 0; i < loopLength; i++) {
        child = $scope.getChildAt(i);
        if(child.name == $instanceName) return child;
    }
    //didn't find it
    return null;
}

, и вы используете ее из любого объекта, который может получить доступ к сцене следующим образом:

var greenLightRef:GreenLight = getMovieClip('GreenLight1',this.stage) as GreenLight;
0 голосов
/ 29 июля 2011

Для варианта 3 класс ресурса равен классу документа (поэтому измените расширение Sprite на MovieClip).Таким образом, он сможет получить доступ к любому экземпляру, размещенному на сцене.Если вы по-прежнему получаете ошибки, дважды проверьте, действительно ли вы назвали экземпляр или у вас нет нескольких ключевых кадров на временной шкале, а экземпляр не находится в первом кадре.

...