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

Основному классу нашего примера программы по созданию виртуального зоопарка мы присвоим имя VirtualZoo. Сначала создадим папку с именем virtualzoo

в файловой системе компьютера, внутри которой создадим вложенную папку src (сокращенно от слова source — «исходный код»). В ней будут храниться все файлы с расширением AS (то есть все файлы, содержащие исходный код).

Исходный код каждого основного класса программы должен размещаться в отдельном текстовом файле, имя которого состоит из имени основного класса и расширения AS. Таким образом, необходимо создать пустой текстовый файл с именем VirtualZoo. as. Нужно убедиться, что имя файла VirtualZoo. as полностью совпадает с именем класса VirtualZoo, поскольку в данном случае учитывается регистр символов. Далее поместим файл VirtualZoo. as в папку virtualzoo/src. Тогда текущая файловая структура для исходных файлов нашей программы будет иметь следующий вид:

virtual zoo |- src |- Virtual Zoo. as

Теперь, когда файл VirtualZoo. as создан, мы можем приступать к написанию класса VirtualZoo. Однако сначала нужно решить возможную проблему: если выбранное имя основного класса будет конфликтовать (то есть совпадать) с именем одного из предопределенных классов языка ActionScript, то компилятор языка ActionScript не позволит создать этот класс и программа не сможет быть выполнена. Чтобы избежать подобных проблем с именами, воспользуемся пакетами.

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

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

Пакеты

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

Когда исходный код класса размещается внутри пакета, имя пакета автоматически становится частью имени класса подобно тому, как ребенок наследует фамилию своих родителей. Например, класс Player, размещенный в пакете game, получает имя game. Player. Обратите внимание, что сначала указывается имя пакета, которое отделяется от имени класса с помощью символа «точка» (.) (термин «символ* в среде программистов обозначает букву, цифру, знак препинания и т. д.). Имя пакета помогает отличить класс game. Player от других классов с именем Player, тем самым предотвращая конфликты имен между различными частями программы или между пользовательскими и предопределенными классами языка ActionScript.

Для создания нового пакета используется директива описания пакета. Рассмотрим этот термин. В языке ActionScript все инструкции программы обычно называются директивами. Описания — это один из типов директив; они создают или описывают, например, пакет или класс. В данном случае описываемым элементом является пакет, откуда и название термина — директива описания пакета.

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

-&_

Если описание создает какой-либо элемент в программе, то говорят, что оно определяет или объявляет этот элемент. Описания часто называют объявлениями.

В общем виде директива описания пакета записывается следующим образом:

package имяПакета {

}

Все описания пакетов начинаются с ключевого слова: package. Ключевое слово — это имя команды, зарезервированное для использования в языке ActionScript. В данном случае ключевое слово package сообщает компилятору ActionScript о необходимости создания пакета. Сразу после ключевого слова package указывается желаемое имя пакета — в предыдущем примере оно заменено выражением имяПакета (здесь и далее код, выделенный подобным образом, например имяПакета, обозначает текст, который должен быть заменен программистом). Затем с помощью фигурных скобок { и } отмечаются начало и конец содержимого пакета. Чтобы добавить класс в пакет, необходимо записать исходный код класса между фигурными скобками, как показано в следующем примере:

package имяПакета { Сюда помещается исходный код класса

}

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

j*_

Полный список операторов языка ActionScript указан в гл. 10.

Принято (но вовсе не обязательно) именам пакетов присваивать следующую иерархическую структуру:

? доменное имя организации, которая занимается разработкой программы, записанное в обратном порядке;

? точка (*);

? общее описание содержимого пакета.

Например, пакету, содержащему классы для картографического приложения, разрабатываемого фирмой Acme Corp. (доменное имя acme. com), может быть присвоено имя com. acme. map, как показано в следующем примере:

package com. acme. map {

}

Обратите внимание, что имя домена верхнего уровня com предшествует имени домена нижнего уровня acme (то есть в имени пакета составляющие доменного имени записываются в обратном порядке).

Доменные имена гарантированно являются уникальными благодаря системе авторизованных регистраторов доменов верхнего уровня. Иными словами, использование доменного имени вашей организации в начале имени пакета позволит избежать конфликтов имен с кодом, разработанным другими организациями.

Теперь попытаемся воспользоваться пакетами в нашей программе создания виртуального зоопарка. Чтобы упростить пример, назовем пакет zoo, без указания доменного имени организации. Для описания пакета zoo добавим следующий код в файл VirtualZoo. as:

package zoo { }

После того как мы добавили пакет в файл VirtualZoo. as, необходимо изменить расположение файла в файловой системе, чтобы оно соответствовало имени созданного пакета. Вследствие требований, налагаемых всеми компиляторами языка ActionScript корпорации Adobe, исходный файл, содержащий класс (или другое описание) внутри пакета, должен размещаться в структуре папок, соответствующей имени пакета. Например, файл, содержащий пакет с именем com. gamecompany. zoo, должен размещаться в папке zoo, вложенной в папку gamecompany, которая, в свою очередь, вложена в папку com (то есть com/gamecompany/zoo). Таким образом, мы создадим новую папку с именем zoo в файловой структуре нашей программы и перенесем файл VirtualZoo. as в эту папку. Файловая структура исходных файлов программы тогда будет выглядеть следующим образом:

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

Virtual zoo |- src |- zoo |- VirtualZoo. as

Теперь, когда у нас есть описание пакета, добавим в него класс VirtualZoo.

Описание класса

Для создания нового класса используется описание класса, как показано в следующем обобщенном коде:

class Идентификатор { }

Описание класса начинается с ключевого слова class, за которым указывается имя класса (в приведенном коде имя класса заменено выражением Идентифика тор). Термин «идентификатор» употребляется в значении «имя». Идентификаторы не должны содержать пробелы или тире и не могут начинаться с цифры. Каждое новое слово

в имени класса принято записывать с прописной буквы, как, например, в именах классов Date или Text Field (TextField — это предопределенный класс среды выполнения Flash, экземпляры которого представляют текст, отображаемый на экране).

Фигурные скобки ({ и }), следующие за выражением Идентификатор в предыдущем описании класса, являются оператором блока, точно так же, как и в примере описания пакета. Оператор блока описания класса называется блоком класса или иногда телом класса. Блок класса содержит директивы, описывающие характеристики и поведение класса и его экземпляров.

В следующем примере приводится описание класса VirtualZoo, являющегося основным классом для нашей игры-симулятора. Описание класса помещено в тело пакета, который описан в файле VirtualZoo. as:

package zoo { class VirtualZoo { }

}

Поскольку описание класса VirtualZoo находится в пакете zoo, полным именем класса (называемым полностью определенным именем класса) является zoo. VirtualZoo. Тем не менее в тексте мы будем использовать сокращенное, или неполное, имя класса — VirtualZoo.

Теперь, когда мы описали основной класс нашей программы, создадим еще один класс — Virtual Pet. С его помощью мы создадим объекты, представляющие зверей в зоопарке.

Как и в случае с классом VirtualZoo, мы поместим код класса VirtualPet впакет zoo, сохранив его в собственном файле VirtualPet. as внутри папки zoo. Исходный код из файла VirtualPet. as выглядит следующим образом:

package zoo { class VirtualPet { }

}

Обратите внимание, что описание пакета может размещаться в нескольких исходных файлах. И хотя классы VirtualZoo и VirtualPet физически хранятся в разных AS-файлах, они принадлежат одному пакету zoo. Любой класс, описание которого принадлежит телу пакета с именем zoo, считается частью этого пакета независимо от имени файла размещения. В отличие же от описания пакета, описание класса не может находиться в нескольких файлах и должно полностью размещаться в одном файле.

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

Модификаторы управления доступом для классов. По умолчанию обращение к классу, входящему в состав определенного пакета, может осуществляться только из кода, принадлежащего тому же пакету. Чтобы класс был доступен для использования за пределами пакета, которому он принадлежит, мы должны описать этот класс с помощью атрибута public. Вообще говоря, атрибуты определяют порядок использования класса и его экземпляров в программе. Атрибуты указываются перед ключевым словом class в описании класса, как показано в приведенном ниже общем примере:

атрибут class ИдентификаторКласса { }

Например, чтобы добавить атрибут public к классу VirtualPet, нужно использовать следующий код:

package zoo { public class VirtualPet { }

}

Однако применение атрибута public в случае с классом VirtualPet необязательно, поскольку класс VirtualPet используется только классом VirtualZoo, а тот, в свою очередь, может обращаться к классу VirtualPet (классы, принадлежащие одному пакету, могут всегда обращаться друг к другу). Таким образом, мы можем вернуться к исходному описанию класса VirtualPet, которое косвенным образом позволяет использовать этот класс только внутри пакета zoo:

package zoo { class VirtualPet { }

}

Если мы хотим явно указать, что класс VirtualPet может быть использован только внутри пакета zoo, то в описание класса необходимо добавить атрибут internal, как показано ниже:

package zoo { internal class VirtualPet { }

}

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

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

Атрибуты internal и public называются модификаторами управления доступом, поскольку управляют порядком доступа к областям внутри программы, в которых допускается использовать данный класс (к ним разрешен доступ данного класса).

В отличие от класса VirtualPet, класс VirtualZoo должен быть определен с помощью атрибута public, поскольку он является основным классом приложения.

Ш|_ I Компиляторы, разработанные корпорацией Adobe, требуют, чтобы основной класс при-| ложен ия был определен с помощью атрибута public.

Следующий код представляет обновленное описание класса VirtualZoo, содержащее обязательный атрибут public:

package zoo { public class VirtualZoo { }

}

Краткий обзор приложения «Зоопарк»

В настоящий момент наша игра состоит из двух классов: VirtualZoo (основной класс) и VirtualPet (класс, представляющий зверей в виртуальном зоопарке). Оба класса принадлежат пакету zoo и хранятся в виде обычных текстовых файлов с именами VirtualZoo. as и VirtualPet. as соответственно.

Согласно требованию, предъявляемому компиляторами языка ActionScript корпорации Adobe, класс VirtualZoo описан с использованием атрибута public, поскольку является основным классом приложения. В отличие от класса VirtualZoo, класс VirtualPet может быть использован только внутри пакета zoo, поскольку описан с помощью атрибута internal.

В примере листинга 1.1 представлен весь имеющийся к настоящему времени код игры, а также кое-что новое — комментарии к исходному коду.

Комментарий к исходному коду — это примечание, которое предназначено только для программистов и не воспринимается компилятором в процессе компиляции кода.

Комментарии к исходному коду ActionScript бывают двух видов: однострочные, начинающиеся с двух слэшей (//), и многострочные, начинающиеся с последовательности /* и заканчивающиеся символами */.

Так выглядит однострочный комментарий:

// Эта информация только для нас, программистов

А так записывается многострочный комментарий:

/*

Эта информация только для нас, программистов */

Текущий код для нашей игры выглядит следующим образом.

Листинг 1.1. Игра «Зоопарк»

// Содержимое файла Virtual Zoo. as package zoo {

public class VirtualZoo {

}

}

// Содержимое файла Virtual Pet. as package zoo {

internal class VirtualPet {

}

}

Теперь приступим к разработке нашей программы, начав с метода-конструктора основного класса приложения — VirtualZoo.

Методы-конструкторы

Метод-конструктор (или сокращенно конструктор) — это отдельный набор инструкций, применяемых для инициализации экземпляров класса. Для создания метода-конструктора внутри блока класса помещается описание функции, как показано в следующем обобщенном коде:

class НекийКласс { function НекийКласс ( ) {

}

}

Как видно из приведенного кода, описание метода-конструктора начинается с ключевого слова function. Затем следует имя метода-конструктора, которое должно полностью совпадать с именем класса (в том числе и регистр символов!). За именем метода-конструктора следует пара круглых скобок, в которых находится список параметров конструктора (они будут рассмотрены позднее). Фигурные скобки ({ и }), следующие за списком параметров, являются оператором блока — точно такие же операторы блока применяются в описаниях пакета и класса. Оператор блока метода-конструктора называется телом конструктора. Тело конструктора содержит директивы, используемые для инициализации экземпляров. Всякий раз, когда создается новый экземпляр класса НекийКласс, выполняются директивы, размещенные в теле конструктора (последовательно, сверху вниз). Процесс выполнения директив, размещенных в теле конструктора, называется выполнением конструктора.

Методы-конструкторы описываются с использованием ключевого слова function, поскольку с технической точки зрения они являются определенным видом функций. Подробно функции будут рассмотрены в гл. 5.

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

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

Class НекийКласс { II Пустой конструктор. Для этого класса инициализация не требуется, function НекийКласс ( ) {

}

}

В отличие от прав доступа классов, права доступа методов-конструкторов не могут регулироваться при помощи модификаторов управления доступом. В языке ActionScript 3.0 все методы-конструкторы косвенно считаются открытыми (тем не менее, возможно, в будущих версиях языка будет включена поддержка и «за-

крытых» методов-конструкторов). В целях обеспечения однородности стиля в этой книге при описании методов-конструкторов используется модификатор управления доступом public, чем подчеркивается тот факт, что все методы-конструкторы должны быть открытыми. Пример использования этого правила приведен в следующем коде:

class НекийКласс { public function НекийКласс ( ) {

}

}

Причина, по которой в языке ActionScript 3.0 методы-конструкторы должны быть открытыми, обусловлена лимитом времени, выделенным на разработку спецификации языка ECMAScript 4, и непостоянством этой спецификации. Подробную информацию по этому вопросу можно найти в статье Шо Кувамото (Sho Kuwamoto) по адресу http://kuwamoto. org/2006/04/05/as3-on-the-lack-of-private-and-protected-constructors (Шо является руководителем команды разработчиков приложения Adobe Flex Builder).

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

Следующий код содержит изменения, связанные с добавлением метода-конструк-торав класс VirtualZoo:

package zoo { public class VirtualZoo { public function VirtualZoo ( ) { }

}

}

Теперь у нашего приложения появилась служебная точка входа. В процессе запуска приложения среда выполнения Flash автоматически создаст экземпляр класса VirtualZoo и выполнит его метод-конструктор. Поскольку наше приложение создает виртуальный зоопарк, первое, что необходимо сделать в конструкторе класса VirtualZoo, — создать объект класса VirtualPet (то есть добавить животное в зоопарк). В следующем разделе мы рассмотрим процедуру создания объектов.

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

Создание объектов

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

new ИмяКласса

Например, чтобы создать объект из класса VirtualPet, используется следующий код:

new VirtualPet

Из одного класса можно создать несколько независимых объектов. В следующем примере описан код создания двух объектов VirtualPet:

new VirtualPet new VirtualPet

Синтаксис констант

Выше было сказано, что для создания нового объекта используется обобщенный синтаксис:

new ИмяКласса

Этот синтаксис применяется как к предопределенным, так и к пользовательским классам языка ActionScript. Например, следующий код демонстрирует создание нового экземпляра предопределенного класса Date, представляющего определенный момент времени:

new Date

Тем не менее для некоторых собственных классов язык ActionScript также предлагает альтернативный, более удобный способ создания экземпляров, называемый синтаксисом констант. К примеру, чтобы создать новый экземпляр класса Number, представляющий число с плавающей запятой 2 5, 4, можно использовать удобную запись в виде константы:

25.4

Подобным же образом для создания нового экземпляра класса String, представляющего текст «hello», можно использовать запись в виде константы:

«hello»

Наконец, чтобы создать новый экземпляр класса Boolean, представляющий логическое состояние true, можно также использовать запись в виде константы:

true

Для создания нового экземпляра класса Boolean, представляющего логическое состояние false, снова применяется запись в виде константы:

false

Синтаксис констант также доступен для классов Ob j ect, Function, RegExp и XML. Синтаксис констант для класса Ob j ect приведен в гл. 15, для класса Function — в гл. 5, а для класса XML — в гл. 18. Информацию по синтаксису констант для класса RegExp можно найти в соответствующей документации корпорации Adobe.

Пример создания объекта: добавление животного в зоопарк

Теперь, когда нам известно, как создавать объекты, мы можем добавить объект класса VirtualPet в нашу программу по созданию виртуального зоопарка. Следующий код делает именно это:

package zoo { public class VirtualZoo { public function VirtualZoo ( ) {

new VirtualPet

}

}

}

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

Однако код не может обращаться к классам в других пакетах. Чтобы получить доступ к открытому классу в другом пакете, необходимо использовать директиву import, которая записывается в следующем общем виде:

i mpo rt имяПакета. ИмяКласса:

В приведенном коде имяПакета — это имя пакета, которому принадлежит класс, а Имя — Класса — это имя открытого класса, который должен быть использован. Если указанный класс не является открытым, то его невозможно будет импортировать, поскольку классы, не являющиеся открытыми, не могут быть использованы за пределами пакета, которому принадлежат. Как только класс будет импортирован в программу, к нему можно обращаться по его неуточненному имени. Например, чтобы создать экземпляр предопределенного класса flash. media. Sound (который используется для загрузки и воспроизведения звуковых файлов), используется следующий код:

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

Import flash. media. Sound new Sound

Если импортировать класс на уровне пакета, то он будет доступен из любого места кода, принадлежащего телу пакета. Например, в следующем коде класс flash. media. Sound импортируется на уровне пакета, а затем создается экземпляр класса Sound в методе-конструкторе VirtualZoo:

package zoo { import flash. media. Sound

public class VirtualZoo { public function VirtualZoo ( ) { new Sound

}

}

}

В случае возникновения конфликта между неуточненными именами классов для них необходимо использовать уточненные имена. Например, если собственный класс Sound описан в пакете zoo, обязательным является использование следующего кода, создающего экземпляр предопределенного класса flash. media. Sound (обратите внимание на использование уточненного имени):

new flash. media. Sound

Для создания же экземпляра класса Sound из пакета zoo нам бы пришлось использовать следующий код:

new zoo. Sound

Использование неуточненного имени класса (то есть Sound) само по себе приводит к ошибке, которая не позволяет откомпилировать программу. Ошибки, которые препятствуют компиляции, называются ошибками этапа компиляции.

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

import имяПакета.*

Например, чтобы получить доступ ко всем открытым классам в пакете flash. media, используется такой код:

import flash. media.*

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

package {

// Классы, описанные здесь, принадлежат безымянному пакету // и могут быть непосредственно использованы // в любом месте кода программы

}

Тем не менее следует избегать размещения описаний классов в безымянном пакете, поскольку их имена могут конфликтовать с именами других классов (и других типов описаний), описанных в языке ActionScript, других программах или даже в других частях одной программы.

Говоря техническим языком, директива import открывает общедоступное пространство имен указанного пакета для текущей и всех вложенных областей видимости. Если вы новичок в программировании на языке ActionScript, то вам не стоит беспокоиться о техническом аспекте директивы import. Вся необходимая информация будет рассмотрена в следующих главах.

Теперь вернемся к нашей первоначальной задаче — созданию объектов в программе «Зоопарк». Вспомним следующий код, в котором создается новый объект класса

VirtualPet:

package zoo { public class VirtualZoo { public function VirtualZoo ( ) { new VirtualPet

}

}

}

В приведенном коде успешно создается новый объект класса VirtualPet, но при этом возникает проблема: после создания объекта программа не имеет никакой возможности обращаться к нему. В результате она не может использовать новое животное или управлять им. Чтобы предоставить ей такую возможность — обращаться к объекту класса VirtualPet, — используются специальные переменные.

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

Переменные и значения

В языке ActionScript любой объект рассматривается как отдельный, независимый фрагмент данных (или информации), называемый значением. Не считая объектов, единственными допустимыми значениями в языке ActionScript являются специальные значения null и undefined, представляющие понятие «пустое значение». Переменная — это идентификатор (то есть имя), ассоциированный со значением. Например, переменной может являться идентификатор submitBtn, который ассоциирован с объектом, представляющим кнопку на интерактивной странице в Интернете. Или переменной может быть идентификатор productDescr iption, ассоциированный с объектом String, описывающим некий продукт.

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

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

Локальные переменные

Локальные переменные применяются для временного отслеживания информации внутри метода-конструктора, метода экземпляра и статического метода или функции. Методы экземпляров и статические методы пока не рассматривались, поэтому сейчас сосредоточимся на использовании локальных переменных в методах-конструкторах.

Для создания локальной переменной внутри метода-конструктора используется описание переменной, как показано в следующем обобщенном коде. Обратите внимание, что описание начинается с ключевого слова va г и, как и все директивы, не содержащие операторов блока, завершается точкой с запятой. Точка с запятой обозначает конец директивы так же, как точка обозначает конец предложения в обычном языке:



Полезные ссылки
Случайные записи
  • 16.03.2011">Руководство по actionscript. часть 3, стр. 014
  • 12.06.2010">Самоучитель по креативному веб-дизайну. Книга 4, стр.107
  • 19.03.2011">Руководство по actionscript. часть 2, стр. 103
  • 02.03.2011">Руководство по actionscript. часть 5, стр. 102
  • 06.07.2012">Google улучшила службу Search by Image
  • 01.03.2011">Руководство по actionscript. часть 5, стр. 124
  • 27.02.2011">Руководство по actionscript. часть 6, стр. 043
  • 26.02.2011">Руководство по actionscript. часть 6, стр. 050
  • 06.03.2011">Руководство по actionscript. часть 4, стр. 129
  • 18.05.2010">Самоучитель по креативному веб-дизайну. Книга 2, стр.44
  • 06.04.2010">Инструменты и сервисы для оптимизации графики
  • 12.03.2011">Руководство по actionscript. часть 3, стр. 135
  • 11.03.2011">Руководство по actionscript. часть 4, стр. 006
  • 22.02.2011">Руководство по actionscript. часть 7, стр. 043
  • 09.06.2011">Acer выпустит маленький ноутбук-трансформер
Опрос

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

View Results

Loading ... Loading ...