Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как обратиться к внешним объектам из описания класса? (http://www.flasher.ru/forum/showthread.php?t=153655)

MAPUTO 07.04.2011 02:54

Как обратиться к внешним объектам из описания класса?
 
Имеется объект-контейнер (DisplayObjectContainer), созданный на Timeline.

Имеется класс в описании которого необходимо использовать обращение к этому контейнеру.

Возможно ли это? Если да, то как?
Заранее спасибо)))

bav 07.04.2011 10:19

Из описания класса DisplayObjectContainer:
Цитата:

Класс DisplayObjectContainer — это абстрактный базовый класс для всех объектов, содержащих дочерние объекты. Он не поддерживает непосредственное создание экземпляров. При вызове конструктора new DisplayObjectContainer() выдается исключение ArgumentError.
1) Каким образом вы смогли создать его на Timeline? Полагаю, под Timeline вы подразумевали stage.
2) Где, по отношению к контейнеру, располагается экземпляр класса, в описании которого необходимо к нему обратиться?
3) Или вы имеете в виду Document class?
4) Это наверняка возможно.

MAPUTO 07.04.2011 11:17

Да, контейнер является дочерним к stage. Экземпляр класса, из которого требуется вызвать контейнер, тоже является дочерним к stage.

Контейнер - не экземпляр DisplayObjectContainer - он экземпляр Sprite, но но выполняет функцию контейнера.

bav 07.04.2011 12:17

Можно в Document class'е при создании экземпляра вашего класса передавать ему ссылку на требуемый контейнер. Например так:
Код AS3:

// Document class
package
{
    import flash.display.MovieClip;
 
    public class Main extends MovieClip
    {
        private var subject:Subject;
        public function Main()
        {
            // Создаем объект. Предполагается, что на сцене
            // существует контейнер с именем cont.
            subject = new Subject(this.cont);
        }
    }
}
 
import flash.display.DisplayObjectContainer;
import flash.display.Sprite;
 
// Разумеется правильнее описывать классы в отдельных файлах.
class Subject extends Sprite
{
    private var container:DisplayObjectContainer;
 
    public function Subject(container:DisplayObjectContainer)
    {
        this.container = container;
        trace("Yep!");
    }
}


MAPUTO 07.04.2011 13:57

Код в первом кадре на Timeline:

Код AS3:

...
var BULET:Sprite = new Sprite();
addChild(BULET);
...
var personag=new pers(this.BULET);
personag.x=300;
personag.y=240;
addChild(personag);
...

Код класса pers:
Код AS3:

package {
 
        import flash.display.MovieClip;
        import flash.display.Sprite;
        import flash.display.DisplayObjectContainer;
        import flash.events.*;
 
 
        public class pers extends Sprite {
 
                private var BuletContainer:DisplayObjectContainer;
 
                public function pers(container:DisplayObjectContainer) {
 
                        BuletContainer = container;
 
                }
        }
}

В Output выдается сообщение:
Код:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at pers()
        at 002_BOOM_fla::MainTimeline/frame1()

Если заменить DisplayObjectContainer на Sprite в описании класса - результат тотже.

bav 07.04.2011 14:13

Кажется, в следующей строчке не нужно писать this, вы же имеете в виду переменную BULET, а не поле в главном классе приложения.
Код AS3:

var personag=new pers(BULET);

Поскорее отучайтесь писать код в кадрах. Вообще же это можно проверить трейсом:
Код AS3:

trace(this.BULET); // если выдаст null, значит я прав.


MAPUTO 07.04.2011 15:02

В том то и проблема, что я хочу перенести весь код в описание классов, но вот взаимодействие между объектами получается только внутри одной иерархической цепочки через parent и child :(
Код AS3:

trace(this.BULET); //[object Sprite]

без директивы this все тоже самое...

bav 07.04.2011 15:13

Вложений: 1
Выложу мой исходник (CS5).

MAPUTO 07.04.2011 15:38

Перенес все в класс Main

Код AS3:

package {
        import flash.display.*;
 
        public class Main extends MovieClip {
 
                var BULET:Sprite = new Sprite();
                var personag:pers;
 
                public function Main() {
 
                        addChild(this.BULET);
                        trace(this.BULET);
                        var personag=new pers(this.BULET);
                        personag.x=300;
                        personag.y=240;
                        addChild(personag);
                }
        }
}

Output:
Код:

[object Sprite]
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at pers()
        at Main()

Сделал так:

Код AS3:

trace(personag); // null

где ошибка? :(

Juice_Green 07.04.2011 15:52

зачем в конструкторе объявляете personag как локальную?


Часовой пояс GMT +4, время: 14:25.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.