Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   копирование MovieClip ? (http://www.flasher.ru/forum/showthread.php?t=114664)

DhuMory 05.08.2008 17:50

копирование MovieClip ?
 
Допустим есть какой-то MovieClip, наприме, камушек mc_Rock.
Хотелось бы завести массив из таких объектов. Расставленных по экрану.
Дублирование объектов, в АS3.0 работает совсем не так как в АS2.0.

(Увы в поиски понятного мне хелпа по данному вопросу успеха не имели)

Код:

import flash.display.*;

var Rock:Array = new Array;

for (var i=0; i<10; i++) { // цикл, хотим наплодить 10 камушков в ряд.
       
Rock[i].x=100+i*20; // ставим камни в рядок       
Rock[i].y=20;       

Rock[i]=addChild(mc_Rock);

} // цикл

Итог никакого клонирования не наблюдается вовсе.
Отображается лишь самый последний "камень".

Извините за тупой вопрос. :rolleyes:
Спасибо.

Xpb7 05.08.2008 17:55

Код:

var rocks:Array = new Array();

for (var i=0; i<10; i++)
{
    rocks[i]= new mc_Rock();
    rocks[i].x=100+i*20;
    rocks[i].y=20;       
    addChild(rocks[i]);
}

mc_Rock должен быть слинкован для использования as3 (Linkage...)

DhuMory 07.08.2008 15:11

Xpb7
Спасибо огромное. Заработало.

mad_god 10.08.2008 16:19

У Вас заработало, а у меня нет :(

здесь rocks - массив, а addchild, как я понял, должен делать дочерний объект.
Нам нужен MovieClip, а в примере получается Array, а не MovieClip.

Кроме того, как именно нужно "слинковать"?

Можно рабочий пример?

Alex Lexcuk 10.08.2008 17:17

http://kind-armadillo.pochta.ru/FlaAC3/Mov_copy.swf
http://kind-armadillo.pochta.ru/FlaAC3/Mov_copy.rar



http://murmadillo.tut.su/fla/copy-prog-create-mc.zip
http://murmadillo.tut.su/fla/copy-prog-create-mc.swf

http://www.dnadillo.dn.ua/fla/doc-mc-info.swf

mad_god 12.08.2008 11:16

Спасибо, помогло. Я раньше не помещал картинки в библиотеку. Теперь вижу, что это очень удобно.

С помощью примеров разобрался, что и как линковать.

Ещё раз спасибо.

ulik 12.08.2008 12:01

Ну, вообще говоря, название темы не совсем точное. Одно дело создать n-ое кол-во экземпляров класса и совсем другое - создать экземпляр класса, изменить в нем свойства, а потом создать клон уже измененного экземпляра класса.

Грубо говоря, вот ваш случай:
Код:

var objectsHolder:Array = new Array();
var numObjects:int = 10;
for(var i:int = 0; i < numObjects; i++)
{
  objectsHolder.push(new Object());
}

А название темы бы больше подошло этому случаю:
Код:

var user:Object = new Object();
user.login = "Ivan";
user.password = "qwerty";

var userCopy:Object = copyObject(user);

function copyObject(sourceObject:Object):Object
{
  var copyObject:Object = new Object();
  for(var p:String in sourceObject)
  {
      copyObject[p] = sourceObject[p];
  }
  return copyObject;
}


/*
Результат:

user - {}
user.login = "Ivan"
user.password  = "qwerty"

userCopy- {}
userCopy.login = "Ivan"
userCopy.password  = "qwerty"
*/


mad_god 12.08.2008 15:41

копирование MovieClip - вот какая тема.

Лично меня интересовало в первую очередь как раз _визуальное_ копирование, то есть программное или при помощи действий юзера появление копии MovieClip в разных координатах окна.

Вот и всё.
Так что приведённые выше примеры не совсем подходят, в них нет ничего визуального и к MovieClip они мало адаптированы пока. Нужно поработать.

"objectsHolder:Array" - я так понял, этот массив может быть как массивом MovieClip`ов, так и массивом объектов? И это определяется автоматом? Или при чём тут Array?

Или это просто массив чисел? Вот что меня интересует.

ulik 12.08.2008 16:57

Почему это ?
Цитата:

в них нет ничего визуального
objectsHolder - это список, хранящий ссылки на childы, не важно чего.
Причем тут Array? Пример:
Вам надо создать 4 Sprite с именами "dog", "cat", "ball", "food".
Варианты:
1. создать 4 переменные и не парится (НО! А если их будет N ? :))
2. перебирать их через getChildByName("имя") - вы запомните N имен?
Как раз для этого вы и создаете массив, который в себе хранит ссылки на объекты, чтобы обращаться к ним просто и легко.
Попробуйте все 3 варианта, думаю, вам станет ясно.
ps:

Код:

var arr:Array = new Array();
arr.push(new Sprite());
arr.push(new Object());
arr.push(new String("test"));
arr.push(new Number(10));

var numElements:int = arr.length;
for(var i:int = 0; i < numElements; i++)
{
  trace(i, arr[i], typeof(arr[i]));
}


mad_god 12.08.2008 18:39

Как я и говорил:
"objectsHolder:Array" - я так понял, этот массив может быть как массивом MovieClip`ов, так и массивом объектов? И это определяется автоматом."

Теперь ясно.

:) Хорошо, что не надо писать Array of Objects или Array of string

То есть, потом обращаемся просто objectsHolder[0], objectsHolder[1], objectsHolder[i], так?

а как приатачить это имя к DisplayObject`ам?
то есть чтобы начать показывать какой-то мувик или спрайт?

ulik 12.08.2008 18:44

Цитата:

Хорошо, что не надо писать Array of Objects или Array of string
скоро придется :)
Цитата:

То есть, потом обращаемся просто objectsHolder[0], objectsHolder[1], objectsHolder[i], так?
да.
Цитата:

а как приатачить это имя к DisplayObject`ам?
то есть чтобы начать показывать какой-то мувик или спрайт?
Код:

addChild(objectsHolder[0]); // скажем

mad_god 12.08.2008 20:43

хорошо, но если Sprite или MovieClip не показывался до этого на экране и не имел х,у. Разве addChild для него добавит его в класс DisplayObject ??

хм

ulik 12.08.2008 20:58

Господи, ну а в as2, при использовании attachMovie что не добавлялись на сцену? :)
Дефолт-то везде {x:0, y:0}

mad_god 13.08.2008 19:41

!О_О! Эти буквы разрывают мне мозг...

Представьте, что на экране нет ничего. Маленький одинокий кружочек, превращённый в MovieClip и которому сделали Linkage, лежит в библиотеке.

К его свойствам я обратиться не могу.

Могу создать что-то типа
var aaa:MovieClip = NEW MovieClip;
Это будет работать и это будет чистый MovieClip с координатами 0,0.

Возможно, я даже смогу нарисовать кружок в первом кадре, сделать его невидимым, а его child`ы делать видимыми в разных координатах.

Но если именно из библиотеки, вот так?
Пишу trace (aaa.x);
нажимаю ctrl+enter и получаю
1119: Access of possibly undefined property x through a reference with static type Class.
WAH??

Я-то понимаю, что у него нет x и y, и на экране он не показывается.
Как же мне его из library "достать" ?

tyapichu 13.08.2008 21:22

может потому что некий объект в библиотеке является классом, а не экземпляром класса?

mad_god 13.08.2008 23:22

var bbb:aaa = new aaa;
addChild(bbb);
bbb.x=100;
bbb.y=100;

Всё работает.
Плачу от счастья, бью низкие поклоны...

Яски 13.08.2008 23:40

[quote=ulik;757743]
скоро придется :)
[quote]
Не придется

tyapichu 21.08.2008 20:02

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

мне нужно скопировать экземпляр этого сложного объекта N раз в массив... так чтобы каждой копии этого оригинального экземпляра можно было так же менять некоторые свойства. ну или хотябы чтобы делая addChild у меня на экран выводился не последний объект, а все.


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

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