Форум 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=136672)

artemst 23.02.2010 08:38

Дублирование ребенка
 
Всем привет. Всю голову поломал, обыскал форум.. такая проблема - нужно скопировать детей мувиклипа, то есть имеем программно созданный клип clipmc к примеру, у него имеются дети clipmc.getChildAt(N) (тоже мувиклипы).., так вот в некоторый момент нужно создать новый клип (дублировать в другое место, причем чтоб первые не исчезал, именно копирование нужно), который является ребенком clipmc. Если кто знает помогите пожалуйста.

lighto 23.02.2010 08:58

ммм... а если в функцию (создание ребенка) а потом трейсить её?

artemst 23.02.2010 09:43

ээ, что-то не совсем понял.. ребенок не создается программно, он уже имеется в программно созданном клипе! Но вроде я уже нашёл решение, правда не знаю насколько оно индусское ))) так что с удовольствием выслушаю ещё ответов :)

Elser 23.02.2010 18:53

примерно та же беда
 
есть клипы закинутые на stage в IDE, имена которых известны
задача - зная имя не класса, а его экземпляра породить такой же с помощью оператора new
тоже копаю как получить класс экземпляра, если он не экспортирован для Actionscript ?

dixus 23.02.2010 19:53

Цитата:

Сообщение от Elser (Сообщение 888682)
тоже копаю как получить класс экземпляра, если он не экспортирован для Actionscript ?

Класс мувика, не экспортированного в ActionScript, будет MovieClip, получить его можно через
Код AS3:

getChildByName("instance name")["constructor"]

, но получить его копию так не выйдет, т.к. новый экземпляр будет пустым мувиком. Если же сэкспортировать в ActionScript, то копию можно сделать так:
Код AS3:

var newInstance:MovieClip = new (getChildByName("instance name")["constructor"])()


Crenth 25.02.2010 22:40

а что если сделать чонить типа так?

Код AS3:

var nemo:Object = new Object();
var present:Object = clipmc.getChildAt(N);
 
for(var i:String in present) {  nemo[i]=present[i] }
 
clipmc.addChild(nemo);

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

dixus 26.02.2010 02:30

Цитата:

Сообщение от Crenth (Сообщение 889324)
а что если сделать чонить типа так?

Код AS3:

var nemo:Object = new Object();
var present:Object = clipmc.getChildAt(N);
 
for(var i:String in present) {  nemo[i]=present[i] }
 
clipmc.addChild(nemo);

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

Не прокатит, так можно получить доступ только к динамическим свойствам.

dimarik 26.02.2010 03:31

Цитата:

Сообщение от dixus (Сообщение 889368)
Не прокатит, так можно получить доступ только к динамическим свойствам.

Не огорчайте ) "To get a list of fixed properties, use the describeType() function"

Crenth 26.02.2010 08:27

Цитата:

Сообщение от dixus (Сообщение 889368)
Не прокатит, так можно получить доступ только к динамическим свойствам.

ну тогда делать

Код AS3:

var nemo:MovieClip = new MovieClip();
 
или лучше
 
var nemo:clipmc_same_Class = new clipmc_same_Class();

в зависимости от того, к какому классу принадлежит clipmc

Elser 05.03.2010 14:37

Вот Вам более приземленный вопрос:
написал метод дублирующий клипы - работает на ура, но есть одна неприятность:
свойство transform дублируется нормально (все значения совпадают), но дублированый клип на стейдже отображается без трансформации
вот код:
Код AS3:

package com.elser.utils {
 
  import flash.utils.getDefinitionByName;
  import flash.utils.getQualifiedClassName;
  import flash.utils.describeType;
  import flash.xml.*;
 
  public class Factory{
    public static function duplicate(instance:Object, clone:Boolean = false):*{
      var instanceClass:Class = getDefinitionByName(getQualifiedClassName(instance)) as Class;
      var newInstance = new instanceClass();
 
      if(clone){
        var typeDescription:XML = describeType(instance);
        trace("-----------------------------------------------------> ACCESSORS");
        for each (var typeProperty:XML in typeDescription.accessor){
          if(typeProperty.@access == "readwrite"){
            (newInstance as instanceClass)[typeProperty.@name] = instance[typeProperty.@name];
            trace(typeProperty.@name+" : "+(newInstance as instanceClass)[typeProperty.@name]);
 
            if(typeProperty.@name == "transform"){
              var typeD:XML = describeType((newInstance as instanceClass)[typeProperty.@name]);
              for each (var typeP:XML in typeD.accessor){
                //вот тут все выводится так как надо!!! а на стейдже как будто без трансформа
                trace("  > "+typeP.@name+" : "+(newInstance as instanceClass)[typeProperty.@name][typeP.@name]);
              }
            }
          }
        }
        trace("-----------------------------------------------------> VARS");
        for each (var typeVariable:XML in typeDescription.variable){
          (newInstance as instanceClass)[typeVariable.@name] = nstance[typeVariable.@name];
          trace(typeVariable.@name);
        }
      }
      trace(newInstance);//[object S2]
      return newInstance as instanceClass;
    }
  }
}

юзаю так:
Код AS3:

package com.elser.components.elements{
        import flash.display.MovieClip;
        import com.elser.utils.Factory;
 
        public class S1 extends MovieClip{
 
                protected var ps2:MovieClip;
 
                public function S1(){
                        super();
                        ps2 = getChildByName("s2") as MovieClip;
                        var ttt:MovieClip = Factory.duplicate(ps2,true);
                        trace(">> "+ttt);//[object S2]
                        ttt.x = 100;
                        ttt.y = 100;
                        addChild(ttt as MovieClip);
                }               
        }       
}



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

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