Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Объясните дурному сишнику работу с Display Object (http://www.flasher.ru/forum/showthread.php?t=183749)

Feareles 31.08.2012 11:44

Объясните дурному сишнику работу с Display Object
 
Меня интересуют некоторые моменты синтаксиса actionscript 3.0 или особенности компиляции adobe flash cs4
1) Пробемма в динамическом выводе на экран объектов, класса-наследника MoviClip. Собственно есть символ S1, имеющий связь с соответствующим классом. Что если я хочу вывести несколько таких объектов на экран, допустим при помощи массива. Собсно код
Код AS3:

import S1;
var s:S1=new S1();
var a:Array=new Array();
var i:int;
 
for(i=0;i<3;i++)
{
  a[i]=s;
  addChild(a[i]);
  a[i].y=i*100;
}

так вот: у всех элементов массива атрибут у одинаковый. Т.е. оно лепит 3 символа на одно место.
могу описать действия далее
- в цикле задавал s.y перед a[i]=s
- добавлял символы с помощью а.push(s)
- заводил дополнительную переменную, которой присваивалась координата у
- в ручную сделал a[0].y=0; a[1].y=100; a[2].y=200
- компилировал код во flash и air
всё равно все символы имели атрибут у как у последнего символа
2) можно ли вызвать addChild из ф-ции as3-класса? Если можно -приведите пожалуйста код
3) как из класса соответствующего символу влиять на то, что творится на таймлайне данного символа. Опять же просьба привести код.

Wolsh 31.08.2012 12:02

Цитата:

var s:S1=new S1();
Вы создали один экземпляр класса S1.
Цитата:

for(i=0;i<3;i++)
{
a[i]=s;
addChild(a[i]);
a[i].y=i*100;
}
Вы создали массив с тремя ссылками на этот экземпляр. То есть а[0], a[1] и a[2] указывают на один единственный объект. В си не так?)))))))))
Как надо было:
Код AS3:

for(i=0;i<3;i++)
{
  a[i]=new S1(); // в цикле создаем столько объектов, сколько нужно.
  addChild(a[i]);
  a[i].y=i*100;
}


caseyryan 31.08.2012 12:09

Цитата:

В си не так?)))))))))
Прочитал первый пост, и тоже хотел это спросить )
По-моему тут разница только в способе отрисовки дисплей объекта на экран. А создается все аналогично

-De- 31.08.2012 12:33

DisplayObject добавляется в display list. И затем этот display list рендерится. Один и тот же DisplayObject может встречаться в этом списке только один раз. Отрендерить его несколько раз (в рамках такого списка отображения), как иногда делается в си - нельзя.

Aquahawk 31.08.2012 12:44

Цитата:

Отрендерить его несколько раз (в рамках этого списка отображения)
Его в принципе можно отрендерить только в одном месте. Даже если списков отображения у вас несколько(у эйра например на каждом окне свой) всё равно один DisplayObject может лежать только в одном родителе и только один раз. Егшо можно перекладывать, но тогда со старого места он пропадёт.

-De- 31.08.2012 12:55

Я про то, что его можно отрендерить в bitmapData несколько раз. Или написать ещё свой рендер какой-то.
Но в рамках стандартного, с addChild/removeChild и пр. - только один.

bav 31.08.2012 13:27

Цитата:

В си не так?)))))))))
В си не так. Например:
Код:

// Оператор new возвращает указатель на созданный объект
SomeClass * firstVar = new SomeClass();
// В данном случае для инициализации secondVar вызывается
// конструктор копирования. В результате получаем копию объекта.
SomeClass secondVar = *firstVar;
// А вот если написать так, то мы скопируем только указатель на объект,
// но не сам объект:
SomeClass * thirdVar = firstVar;

// Если бы у нас был какой-нибудь литерал для создания объектов,
// скажем как у класса string, тогда дело выглядит так.
string firstString = "Hello, World";
// И в этом случае опять же вызывается конструктор копирования.
string secondString = firstString;


Wolsh 31.08.2012 13:44

Цитата:

В си не так. Например:
Хм.. и что в си не так?
Код:

SomeClass secondVar = *firstVar;
Ну так здесь оператор копирования. У автора в коде нет никакого оператора копирования.
Цитата:

a[i]=s;
То есть как раз
Цитата:

// А вот если написать так, то мы скопируем только указатель на объект,
// но не сам объект:
SomeClass * thirdVar = firstVar;
Все точно так же.
Со стрингом как простым типом так же не вижу никаких различий.

Frost47rus 31.08.2012 14:20

1) если требовалось создать в цикле несколько экземпляров одного и того же класса и запихать их в массив, то вот:
Код AS3:

var myArray:Array = new Array();
for (var i:int = 0; i < 3; i++){
 var item:S1 = new S1();
 item.y = i*100;
 myArray.push(item);
 addChild(item); //или в любом другом месте (в соответствие с видимостью) - addChild(myArray[new int]);
}

2) не понял вопроса
3) если в классе есть публичные методы, влияющие на поведение экземпляра - конечно же, можно.

caseyryan 31.08.2012 14:43

Цитата:

2) можно ли вызвать addChild из ф-ции as3-класса? Если можно -приведите пожалуйста код
Можно, если этот класс наследник DisplayObjectContainer

Код AS3:

package {
    public class SomeClass extends Sprite { // Sprite - наследник DisplayObjectContainer'а, значит у него есть метод addChild и он может содержать в себе дисплей объекты
          public function SomeClass() {
                  addSomeStuff();
          }
          private function addSomeStuff():void {
                for (var i:int = 0; i < 10; i++) {
                        addChild(new SomeDisplayObject());
                }
          }
    }
}



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

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