Руководство по actionscript. часть 3, стр. 118

Список отображения

Как уже говорилось, базовые классы отображения представляют типы графического содержимого, доступного в языке ActionScript. Чтобы создать реальную графику из этих теоретических типов, мы создаем экземпляры базовых классов отображения, а затем добавляем эти экземпляры в список отображения. Список отображения — это иерархия всех графических объектов, отображаемых средой выполнения Flash в настоящий момент. Когда отображаемый объект добавляется в список отображения и помещается в видимую область, среда Flash визуализирует содержимое этого объекта на экране.

Корневым элементом списка отображения является экземпляр класса Stage, который создается автоматически при запуске среды выполнения Flash. Этот особый, автоматически создаваемый экземпляр класса Stage выполняет две задачи. Во-первых, он выступает в качестве внешнего контейнера для всего графического содержимого, отображаемого средой выполнения Flash (то есть является корнем списка отображения). Во-вторых, он предоставляет информацию о глобальных характеристиках области отображения и позволяет управлять ими. Например, переменная экземпляра quality класса Stage определяет качество визуализации всей

отображаемой графики; переменная scaleMode задает способ масштабирования графики при изменении размеров области отображения; переменная f rameRate определяет текущую предпочтительную скорость (кадров в секунду) для всех анимационных роликов. Как будет рассказано в этой главе, обращение к экземпляру класса Stage всегда осуществляется через некоторый объект в списке отображения с помощью переменной экземпляра stage класса DisplayObject. Например, если output txt — экземпляр класса TextField, который в настоящий момент находится в списке отображения, обратиться к экземпляру класса Stage можно выражением output_txt. stage.

До появления языка ActionScript 3.0 класс Stage не содержал объекты из списка отображения. Более того, ко всем его методам и переменным можно было обращаться непосредственно через сам класс, как показано в следующем коде:

trace(Stage. align);

В языке ActionScript 3.0 к методам и переменным класса Stage нельзя обратиться через класс Stage, кроме того, не существует глобальной точки, ссылающейся на экземпляр класса Stage. В языке ActionScript 3.0 приведенная строка кода вызовет следующую ошибку:

Access of possibly undefined property ‘align’ through a reference with static type ‘Class’

На русском языке она будет звучать так: Обращение к возможно неопределенному свойству ‘align’ через ссылку на статический класс ‘Class’.

Чтобы избежать появления этой ошибки, обращайтесь к экземпляру класса Stage с помощью следующего подхода:

t race(некийОтображаемыйОбъект. stage. align):

Здесь некийОтображаемыйОбъект — это объект, который в настоящий момент находится в списке отображения. Архитектура класса Stage в языке ActionScript 3.0 позволяет в будущем иметь несколько экземпляров класса Stage, а также вносит вклад в систему безопасности приложения Flash Player (поскольку неавторизованные объекты, загруженные из внешних источников, не имеют глобальной точки для обращения к экземпляру класса Stage).

На рис. 20.2 представлено состояние списка отображения для пустой среды выполнения Flash до момента открытия SWF-файла. Левая часть рисунка демонстрирует символическое представление среды выполнения Flash, а правая часть — соответствующую иерархию списка отображения. Когда среда Flash пуста, иерархия списка отображения содержит всего один элемент (единственный экземпляр класса Stage). Но скоро появятся другие элементы!

Когда пустая среда Flash открывает новый SWF-файл, она находит основной класс этого SWF-файла, создает экземпляр данного класса и добавляет созданный экземпляр в список отображения в качестве первого ребенка экземпляра класса Stage.

^ I Напомним, что основной класс SWF-файла должен быть унаследован либо от класса Sprite, м$ а « тбо от класса MovieClip, каждый из которых является потомком класса DisplayObject. 4 _3л4 Методики определения основного класса SWF-файла рассматриваются в гл. 7.

Руководство по actionscript. часть 3, стр. 119

Проигрыватель Flash

Список отображения

Экземпляр класса Stage

Экземпляр класса Stage

1

Рис. 20.2. Список отображения для пустой среды выполнения Flash

Экземпляр основного класса SWF-файла является точкой входа программы и первым графическим объектом, отображаемым на экране. Даже если экземпляр основного класса не создает никакую графику, он все равно добавляется в список отображения, готовый содержать любую графику, создаваемую приложением в будущем. Экземпляр основного класса первого SWF-файла, открываемого средой выполнения Flash, играет особую роль в языке ActionScript; он определяет конкретные глобальные настройки среды, например разрешение относительных URL-адресов и тип ограничений безопасности, применяемых к операциям с внешними источниками.

$4

В честь особой роли, которую играет экземпляр основного класса первого SWF-файла, открываемого средой выполнения Flash, он иногда называется владельцем сцены.

Рассмотрим пример, который демонстрирует, как создается владелец сцены. Предположим, мы запустили автономную версию приложения Flash Player и открыли файл с именем GreetingApp. swf, основным классом которого является GreetingApp. Если файл GreetingApp. swf содержит только этот класс и класс GreetingApp не создает никакой графики, то список отображения приложения Flash Player будет включать всего два элемента: экземпляр класса Stage и экземпляр класса GreetingApp (содержащийся в экземпляре класса Stage). Это показано на рис. 20.3.

Проигрыватель Flash

Список отображения

Экземпляр класса Stage

Экземпляр класса GreetingApp файла GreetingApp. swf

Экземпляр класса Stage

Экземпляр класса GreetingApp файла GreetingApp. swf

Рис. 20.3. Список отображения для файла GreetingApp. swf

Как только экземпляр основного класса SWF-файла будет добавлен в экземпляр класса Stage, программа сможет добавлять новое содержимое на экран в такой последовательности.

Руководство по actionscript. часть 3, стр. 120

1. Создать отображаемый объект (то есть экземпляр любого базового класса отображения или любого класса, который расширяет базовый класс отображения).

2. Вызвать метод экземпляра addChild ( ) класса DisplayOb j ectContainer либо над экземпляром класса Stage, либо над экземпляром основного класса и передать в метод addChild ( ) отображаемый объект, созданный на шаге 1.

Попробуем выполнить вышеописанные общие шаги, создав класс GreetingApp, а затем добавив прямоугольник, круг и текстовое поле в список отображения с помощью метода addChild ( ). Сначала приведем основу класса GreetingApp:

package { import flash. display.*: import flash. text. TextField:

public class GreetingApp extends Sprite { public function GreetingApp ( ) { }

}

}

В нашем классе GreetingApp будут использованы классы Shape и Sprite, поэтому мы импортируем целиком весь пакет flash. display, который содержит эти классы. Подобным образом в классе GreetingApp будет использован класс TextField, поэтому мы импортируем пакет flash. text. TextField.

Обратите внимание на то, что класс GreetingApp по необходимости расширяет класс Sprite. GreetingApp должен расширять либо класс Sprite, либо класс MovieClip, поскольку он является основным классом программы.

| В языке ActionScript 3.0 основной класс SWF-файла должен расширять либо класс Sprite, нг л «, ли6° класс MovieClip, либо их любой подкласс.

1 -

Когда основной класс представляет корневую временную шкалу FLA-файла, он должен расширять класс MovieClip. Во всех остальных случаях основной класс должен расширять класс Sprite. В нашем примере класс GreetingApp расширяет класс Sprite, поскольку он не ассоциирован с FLA-файлом. В результате компиляции этого класса должно получиться автономное приложение ActionScript.

Теперь создадим прямоугольник и круг в методе-конструкторе класса Gr ее t ingApp. И прямоугольник, и круг мы нарисуем внутри одного объекта Shape. Объекты Shape (и все графические объекты) создаются с помощью оператора new, как и объекты любого другого типа. Вот код, который используется для создания нового объекта Shape:

new ShapeC )

Безусловно, в дальнейшем нам придется обращаться к этому объекту, чтобы нарисовать в нем элементы, поэтому присвоим его переменной rectAndCircle: var rectAndCircle-.Shape = new ShapeC );

Для рисования векторов в языке ActionScript применяется вспомогательный класс отображения Graphics. Каждый объект Shape хранит свой собственный экземп-

ляр класса Graphics в переменной экземпляра graphics. Таким образом, чтобы нарисовать прямоугольник и круг внутри нашего объекта Shape, мы вызываем соответствующие методы над объектом rectAndCircle. graphics. Вот этот код:

// Задаем толщину линии, равную одному пикселу rectAndCi rclе. graphi cs.1i neStyle(1):

// Рисуем синий прямоугольник

rectAndCi rcle. graphics. beginFi11(OxOOOOFF, 1):

rectAndCircle. graphics. drawRect(125. 0. 150. 75):

// Рисуем красный круг

rectAndCi rcle. graphics. begi nFi11(OxFFOOOO, 1); rectAndCircle. graphics. drawCircle(50. 100. 50):

*\ -’-

I Дополнительную информацию о вектррном рисовании в языке ActionScript 3.0 можно м& найти в гл. 25.

Руководство по actionscript. часть 3, стр. 121

Операции векторного рисования не ограничиваются классом Shape. Класс Sprite также предоставляет ссылку на объект Graphics через свою переменную экземпляра graphics, поэтому, чтобы нарисовать прямоугольник и круг, вместо объекта Shape мы могли бы создать объект Sprite. Тем не менее, поскольку для хранения объекта Sprite требуется больше памяти, чем для объекта Shape, лучше использовать объект Shape при создании векторной графики, не содержащей дочерних объектов и для которой не требуется интерактивности.

Строго говоря, если бы мы хотели добиться минимального расходования памяти в примере приложения GreetingApp, мы бы рисовали наши фигуры непосредственно внутри экземпляра класса GreetingApp (помните, что класс GreetingApp расширяет класс Sprite, поэтому он поддерживает векторное рисование). Наш код выглядел бы следующим образом:

package { import flash. display.*: public class GreetingApp extends Sprite { public function GreetingApp ( ) { graphics. lineStyle(l):

// Прямоугольник

graphics. beginFill(OxOOOOFF. 1): graphics. drawRect(125. 0. 150. 75):

// Круг

graphi cs. begi nFi11(OxFFOOOO. 1); graphics. drawCircle(50. 100. 50):

}

}

}

Этот код успешно рисует прямоугольник и круг на экране, но данный подход менее гибок, чем подход с помещением фигур в отдельный объект Shape. Помещение

рисунков в объект Shape позволяет переносить их, размещать по слоям, модифицировать и удалять независимо от остального графического содержимого в приложении. Например, возвращаясь к нашему предыдущему подходу с рисованием в экземпляре класса Shape (rectAndCircle), для перемещения фигур в новую позицию мы могли бы использовать следующий код:

// Перемещаем объект rectAndCircle вправо на 125 пикселов // и вниз на 100 пискелов rectAndCirclе. х = 125: rectAndCirclе. у = 100:

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

Обратите внимание, что предыдущее позиционирование объекта rectAndCircle осуществляется до того, как этот объект будет помещен в список отображения! Каждый отображаемый объект сохраняет свое собственное состояние, независимо от родителя, с которым он связан, — фактически независимо от того, добавлен объект в список отображения или нет. Когда объект rectAndCircle будет добавлен в контейнер отображения, он будет автоматически помещен в позицию (125; 100) координатного пространства этого контейнера. Если в дальнейшем объект rectAndCircle будет удален из этого контейнера и добавлен в другой контейнер, он будет помещен в позицию (125; 100) координатного пространства нового контейнера.

Руководство по actionscript. часть 3, стр. 122

* л

^ I Любой отображаемый объект сохраняет свои характеристики при перемещении из одного л « контейнера в другой и даже при удалении из списка отображения.

—3tj_

Теперь наступает момент, которого мы с нетерпением ожидали. Чтобы отобразить фигуры на экране, мы вызываем метод addChild ( ) над экземпляром класса GreetingApp внутри конструктора GreetingApp и передаем в этот метод ссылку на экземпляр класса Shape, хранящуюся в переменной rectAndCircle.

// Отображаем объект rectAndCircle на экране, добавляя его // в список отображения addChi1d(rectAndCircle):

В результате приложение Flash Player добавляет объект rectAndCircle в список отображения в качестве ребенка экземпляра класса GreetingApp.

#^

I Как подкласс класса Sprite, класс GreetingApp является потомком класса DisplayObjectContainer

м? л* и, следовательно, наследует метод addChild() и возможность содержать детей. Чтобы

Щ вспомнить иерархию классов API отображения, вернитесь к рис. 20.1.

Отображение объектов на экране — это забавно! Проделаем это еще раз. Добавление следующего кода в конструктор класса GreetingApp приведет к отображению на экране текста «НеПо world»:

// Создаем объект TextField, который будет содержать некий текст var greeting_txt:TextField = new TextField( );

// Указываем отображаемый текст greeting_txt. text = «Hello world»;

// Задаем позицию объекта TextField greeting_txt. x = 200; greeting_txt. y = 300;

// Отображаем текст на экране, добавляя объект greeting_txt // в список отображения addCh i1d(greeti ng_txt);

Когда объект будет добавлен в контейнер отображения, обратиться к этому контейнеру можно будет через переменную экземпляра parent класса DisplayOb j ect. Например, в конструкторе класса GreetingApp следующее выражение является допустимой ссылкой на экземпляр класса GreetingApp:

greeti ng_txt. parent

Если отображаемый объект еще не был добавлен в список отображения, его переменная parent имеет значение null.

Руководство по actionscript. часть 3, стр. 123

Листинг 20.1 демонстрирует код приложения GreetingApp целиком. Листинг 20.1. Графическое приложение «НеНо world*

package { import flash. display.*; import flash. text. TextField;

public class GreetingApp extends Sprite { public function GreetingApp( ) { // Создаем объект Shape var rectAndCircle:Shape = new Shape( );

// Задаем толщину линии один пиксел rectAndCi rclе. graphi cs.1i neStyle(1);

// Рисуем синий прямоугольник

rectAndCircle. graphics. beginFill(OxOOOOFF. 1);

rectAndCircle. graphics. drawRect(125, 0. 150. 75);

// Рисуем красный круг

rectAndCi rcle. graphi cs. begi nFi11(OxFFOOOO. 1); rectAndCircle. graphics. drawCircle(50. 100. 50);

// Перемещаем фигуры вправо на 125 пикселов и вниз на 100 пискелов rectAndCirclе. х = 125; rectAndCirclе. у = 100;

// Выводим объект rectAndCircle на экране, добавляя его // в список отображения addChi1d(rectAndCircle);

// Создаем объект TextField, который будет содержать некий текст var greeting_txt:TextField = new TextField( );

// Указываем отображаемый текст greeting_txt. text = «Hello world»;

// Задаем позицию текста greeting_txt. x = 200; greeting_txt. y = 300;

// Выводим текст на экране, добавляя объект greeting_txt // в список отображения addChild(greeting_txt);

}

На рис. 20.4 в графическом виде показаны результаты выполнения кода из листинга 20.1. Как и на двух предыдущих рисунках, графика, отображаемая на экране, показана слева, а соответствующая иерархия списка отображения приложения Flash Player — справа.

Руководство по actionscript. часть 3, стр. 124

Экземпляр класса Stage

Экземпляр класса GreetingApp файла GreetingApp. swf

Экземпляр класса Shape rectAndCircle

Экземпляр класса TextField greeti ng_txt

Проигрыватель Flash

Список отображения

Экземпляр класса Stage

Экземпляр класса GreetingApp файла GreetingApp. swf I

Экземпляр класса Shape

Экземпляр I класса TextField I

Рис. 20.4. Список отображения для приложения GreetingApp

Контейнеры и глубины

В предыдущем разделе мы добавили в приложение GreetingApp два отображаемых ребенка (rectAndCircle и greeting txt). На экране они были размещены так, чтобы не перекрывать друг друга. Если бы они перекрывались, один объект закрывал бы другой в соответствии с глубинами этих двух объектов.

Глубина отображаемого объекта — это целочисленное значение, которое определяет, как данный объект перекрывает другие объекты в одном и том же контейнере

отображаемых объектов. Когда два объекта перекрываются, тот объект, у которого позиция глубины больше («высший» из двух), закрывает другой объект («низший» из двух). Следовательно, можно считать, что все отображаемые объекты в контейнере размещаются по порядку в визуальном стеке наподобие колоды уложенных в стопку игральных карт, счет которых начинается с нуля. Самый нижний объект в стеке имеет позицию глубины, равную 0, а самый верхний — позицию глубины, равную количеству объектов-детей в контейнере отображаемых объектов минус один (по аналогии самая нижняя карта в колоде имеет позицию глубины, равную 0, а самая верхняя — позицию глубины, равную количеству карт в колоде минус один).

Руководство по actionscript. часть 3, стр. 125

_А_

щ в API управления глубиной отображаемых объектов языка ActionScript 2.0 допускалось Ур^Д существование «незаполненных» глубин. Например, в контейнере, содержащем всего ^лт^ два объекта, первый объект мог иметь глубину, равную 0, а другой объект — глубину, равную 40, оставляя незаполненными глубины от 1 до 39. В API управления глубиной отображаемых объектов языка ActionScript 3.0 появление незаполненных глубин не допускается и вообще невозможно.

Отображаемым объектам, добавляемым в контейнер с помощью метода addChi Id ( ), позиции глубины присваиваются автоматически. Если взять пустой контейнер, то первый ребенок, добавленный через метод addChi Id ( ), помещается на глубину 0, второй — на глубину 1, третий — на глубину 2 и т. д. Таким образом, объект, добавленный последним через метод addChild ( ), всегда отображается поверх остальных детей.

В качестве примера продолжим работу с программой GreetingApp из предыдущего раздела. На этот раз мы нарисуем круг и прямоугольник в отдельных экземплярах класса Shape, чтобы их можно было размещать в стеке независимо друг от друга. Кроме того, изменим позиции круга, прямоугольника и текста таким образом, чтобы они перекрывались. Рассмотрим измененный код (этот код и другие примеры данного раздела взяты из метода-конструктора класса GreetingApp):

// Прямоугольник

var rect:Shape = new Shape( );

rect. graphi cs. 1 i neSty1e(1):

rect. graphi cs. begi nFi11(OxOOOOFF. 1):

rect. graphics. drawRect(0. 0. 75. 50);

// Круг

var circle:Shape = new Shape( );

ci rcle. graphi cs.1i neSty1e(1):

circle. graphics. beginFi 11(OxFFOOOO. 1):

circle. graphics. drawCircle(0. 0. 25);

circle. x = 75:

circle. у = 35;

// Текстовое сообщение

var greeting_txt:TextField = new TextField( ): greeting_txt. text = «Hello world»: greeting_txt. x = 60; greeting_txt. y = 25;

Теперь попытаемся добавить прямоугольник, круг и текст в качестве детей экземпляра класса GreetingApp, используя различные последовательности. Следующий код сначала добавляет прямоугольник, затем круг и после него — текст:

. addChiId(rect); // Глубина О

addChild(circle): // Глубина 1

addChi1dCgreeting_txt); // Глубина 2

Как показано на рис. 20.5, прямоугольник был добавлен первым, поэтому он отображается под кругом и текстом. Затем был добавлен круг, поэтому он отображается поверх прямоугольника, но под текстом. Текст был добавлен последним, поэтому он отображается поверх прямоугольника и круга.

Руководство по actionscript. часть 3, стр. 126

Следующий код изменяет последовательность, добавляя сначала круг, затем прямоугольник и после этого — текст. На рис. 20.6 показан результат. Обратите внимание, как простое изменение последовательности, с учетом которой добавляются объекты, влияет на конечный результат.

addChild(circle); // Глубина О

addChiId(rect); // Глубина 1

addChi1d(greeting_txt); // Глубина 2

Рассмотрим еще один пример. Следующий код сначала добавляет текст, затем окружность и после нее — прямоугольник. На рис. 20.7 показан результат.

addChiId(greeting_txt): // Глубина О addChild(circle): // Глубина 1

addChild(rect): // Глубина 2

Рис. 20.5. Прямоугольник, Рис. 20.6. Круг, Рис. 20.7. Текст, круг,

круг, текст прямоугольник, текст прямоугольник

Для того чтобы получить позицию глубины любого объекта в контейнере отображаемых объектов, нужно использовать метод экземпляра getChildlndex ( ) класса DisplayObjectContainer:

trace(getChildlndex(rect)); // Выводит: 2

Чтобы добавить новый объект в определенную позицию глубины, используется метод экземпляра addChildAt ( ) класса DisplayObjectContainer (обратите внимание: addChildAt ( ), а не addChild ( ) ). Этот метод принимает следующий вид:

контейнер. addChi 16М(отображаемый0бьект. позиция Гпубины)

Значение параметра позиция Гпубины должно находиться в пределах от 0 до значения контейнер. numChildren включительно.

Если указанная позиция позиция Гпубины уже занята существующим ребенком, объект отображаемыйОбъект будет помещен позади этого существующего объекта (то есть позиции глубины всех отображаемых объектов, которые равны указанному значе-

нию или выше его, увеличиваются на единицу, чтобы освободить место для нового ребенка).

Руководство по actionscript. часть 3, стр. 127

^ I Повторяйте про себя это мнемоническое правило метода addChildAt(): «Если глубина *г А, в занята, новый ребенок помещается позади».

_ _

Для добавления нового объекта поверх всех существующих детей используется следующий код:

контейнер. addChi 1 АМШображаемыйОбъект. контейнер. numChi 1 dren) что аналогично следующей записи: контейнер. addChi 16(отображаемый0бъект)

Обычно метод addChildAt ( ) применяется совместно с методом экземпляра getChildlndex ( ) класса DisplayOb j ectContainer для добавления объекта ниже существующего ребенка в заданном контейнере. Вот общий формат:

контейнер. addChi 1 dAt(новыйРебенок.

контейнер. де1Ш161г\6ех(существующийРебенок))

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

Рассмотрим код, который создает треугольник:

var triangle:Shape = new Shape( ); tri angle. graphi cs.1ineSty1e(1); triangle. graphics. beginFill(OxOOFFOO. 1); triangle. graphics. moveTo(25. 0): triangle. graphics. lineTo(50. 25): triangle. graphics. lineToCO. 25): triangle. graphics. lineToC25. 0): triangle. graphics. endFill( ); triangle. x = 25: triangle. у = 10:

Теперь рассмотрим код, который делает объект triangle новым ребенком экземпляра класса GreetingApp, размещая его ниже существующего объекта circle (обратите внимание, что методы addChildAt ( ) и getChildlndex ( ) неявно вызываются над текущим объектом GreetingApp). На рис. 20.8 показаны результаты.

addChi1dAt(triangle. getChildlndex(circle)):

Рис. 20.8. Новый ребенок-треугольник

Как недавно было сказано, когда новый объект добавляется в позицию глубины, занятую существующим ребенком, позиции глубины существующего ребенка и всех

детей, расположенных выше его, увеличиваются на единицу. Новый объект затем занимает позицию глубины, которая была освобождена существующим ребенком. Например, перед добавлением объекта triangle глубины детей экземпляра класса GreetingApp выглядели следующим образом:

После добавления объекта triangle позиция глубины объекта circle изменилась с 1 на 2, позиция глубины объекта rect — с 2 на 3, а объект triangle занял глубину 1 (предыдущая глубина объекта circle). Между тем позиция глубины объекта greet ing txt не изменилась, поскольку с самого начала она была меньше глубины объекта circle. Вот измененные глубины после добавления объекта triangle:

greeting_txt О triangle 1 circle 2 rect 3

Чтобы изменить глубину существующего ребенка, мы можем поменять местами позиции глубины этого ребенка и другого существующего ребенка с помощью методов экземпляра swapChildren ( ) или swapChildrenAt ( ) класса DisplayObjectContainer. Можно также непосредственно задать глубину для этого ребенка, используя метод экземпляра setChildlndex ( ) класса DisplayObj ectContainer.



Полезные ссылки
Случайные записи
  • 14.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.80
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 025
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 095
  • 19.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.32
  • 09.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.155
  • 01.04.2012">ЕС создаст центр по борьбе с киберпреступностью
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 041
  • 22.01.2011">Руководство по actionscript. часть 1, стр. 138
  • 19.03.2011">Руководство по actionscript. часть 2, стр. 086
  • 24.02.2011">Руководство по actionscript. часть 7, стр. 001
  • 08.03.2011">Руководство по actionscript. часть 4, стр. 079
  • 10.05.2010">Самоучитель по креативному веб-дизайну. Книга 1, стр.91
  • 20.03.2011">Руководство по actionscript. часть 2, стр. 079
  • 02.06.2010">Самоучитель по креативному веб-дизайну. Книга 3, стр.104
  • 26.07.2011">Ноутбук ACER AS7520G-502G16Mi
Опрос

Какие цвета вы предпочитаете?

View Results

Loading ... Loading ...