Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > ActionScript 3 > Доступ к root


Автор: VingradFan 26.6.2011, 17:55
Здравствуйте. Перехожу с АС2 на АС3 со скрипом, поэтому прошу не пинать ногами.

Как сделать так, чтобы экземпляр класса, объявленный в root, создавал в нем мувиклип? Спасибо большое!




Код

public class Ball
 {
  var mainBall:BallSimple = new BallSimple  ;
       public function Ball()
       {
              //Как добавить mainBall в root????????
              //root.addChild(mainBall);
       }
}


Класс BallSimple - наследник MovieClip

Автор: VingradFan 27.6.2011, 10:45
ОМГ 50+ просмотров -  0 ответов!!!


Как из экземпляра импортированного класса обратиться к таймлайну????

Автор: SoWa 27.6.2011, 16:12
В таймлайне у тебя создан экземпляр Ball, так?
В экземпляре Ball создается экземпляр BallSimple. Если оба наследуются от того-же MovieClip, то в Ball пиши что-то типа this.addChild(mainBall)
В таймлайне пиши addChild(ballObject), где ballObject - экземпляр класса Ball.
Изнутри ты сможешь получить, только если в конструкторе передашь this(по сути - root).

Автор: VingradFan 27.6.2011, 16:22
SoWa, спасибо за ответ. Я сам дошел до вот таких костылей, я так понял, ты их и предлагаешь.

класс:
Код

class Ball extends MovieClip
{
    private var ballMovie:MovieClip = new BallSimple();
    public function Ball()
    {
        this.addChild(ballMovie);
    }
}



таймлайн:
Код

import Ball;
var ballOne=new Ball();
this.addChild(ballOne);



Но это ведь не труъ подход. Мне казалось, труъ подход - это когда я создаю экземпляр класса и он сам все делает без добавления детей в таймлайн. Что-то вроде

Код

import Ball;
var ballOne=new Ball();

и ХОП! на таймлайне шарик, который сам знает, как себя двигать по сцене, как реагировать на нажатия итд
var ballTwo=new Ball();  и еще один.
Или я ошибаюсь?

Автор: VingradFan 27.6.2011, 16:37
SoWa, я понял твою мысль из последнего абзаца! Спасибо! Получилось как-то так:

Класс:
Код

package test
{
    import flash.display.MovieClip;
    public class Ball extends MovieClip
    {
        private var ballMovie:MovieClip = new BallSimple();
        public function Ball(ballParent:MovieClip)
        {
            ballParent.addChild(ballMovie);
        }
    }
}



Таймлайн:

Код

import test.Ball;
var ballOne=new Ball(this);


Тоесть, я передаю ссылку на таймлайн в парамере конструктора. Так?
То, что я и хотел. Экземпляр класса сам добавляет шарик на таймлайн.

В итоге, какой подход лучше?????

Автор: SoWa 28.6.2011, 05:31
Я рад, что у тебя получилось реализовать оба подхода )

С точки зрения архитектуры программы - первый лучше. Т.е. твоим шариком должна управлять некая логика. Сам по себе шарик логикой не обладает. Это из концепции MVC и здравого смысла. Например, логика может быть заложена в поле для шариков.
Что касается второго подхода - со ссылкой на this - я еще не исследовал, что там получается по поглощению памяти... Мне второй подход не нравится как технически, так и эстетически.
Но если ты всеж желаешь, чтобы шарик сам собой управлял - оставляй второй. Только потестируй, загони на таймлайн 500 шариков и посмотри на ресурсы приложения.

Автор: VingradFan 28.6.2011, 12:39
Во втором варианте получилось так: 100 экземаляров класса кушают 12 MB памяти.
Это много или мало?

Автор: SoWa 28.6.2011, 17:25
Это нормально. Я узнал, ссылки передаются - с памятью проблем не возникнет.
В общем, делай как тебе удобно smile Но я бы логику вынес из объектов.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)