Бесплатно скачать Adobe Flash Player

Введение в ActionScript 2.0 для пользователей ActionScript 1.0: Часть Вторая

Как и обещали, в этой части поговорим о формальном синтаксисе классов в ActionScript 2.0 (сокращенно — AS2). Сразу заметим, что для правильного усвоения этой статьи вы должны быть уже знакомы с объектно-ориентированным программированием. Для этого можно почитать ООП от Робина Дебройла (на русском) или вот это на английском:

http://www.oreillynet.com/pub/a/javascript/2003/08/12/actionscriptckbk.html
http://www.oreillynet.com/pub/a/javascript/2003/08/19/actionscriptckbk.html

(Если вы можете отличить конструктор от метода, читать это необязательно).

Структура класса в ActionScript 2.0

Сравнивая структуру "класса" в AS1 и структуру класса в AS2, скорее можно запутаться, чем прояснить дело. Правда в том, что в AS2 структура класса фундаментально отличается от знакомой нам по AS1. Если вы создавали классы в Java или C#, или даже в VB или PHP, то можете кричать "ура". Если же весь ваш объектно-ориентированный опыт связан с ActionScript 1.0, тоже не особо расстраивайтесь. Конечно, в ActionScript 2.0 синтаксис отличается, но зато он намного более последователен. Недели создания классов в ActionScript 2.0 вам хватит, чтобы затем еще и удивиться, как в ActionScript 1.0 вообще можно было делать что-то подобное.

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

  • Классы ActionScript 2.0 должны быть описаны в .as-файлах, в одном файле может быть описан только один класс;
  • Классы ActionScript 2.0 объявляются при помощи нового ключевого слова class, за которым следует имя класса, а за именем класса следует заключенное в фигурные скобки его тело (называемое определением класса). Например:

    class Car {
    // Описание класса..
    }
  • Классы ActionScript 2.0 могут содержаться в пакетах (packages). ActionScript 2.0 поддерживает ключевое слово import, чтобы импортировать целые пакеты с классами или отдельные классы из пакетов;
  • Члены классов ActionScript 2.0 могут быть объявлены как члены с разными режимами доступа: public, private, и static;
  • Классы ActionScript 2.0 могут расширять другие классы, для этого при объявлении класса используется ключевое слово extends;
  • Классы ActionScript 2.0 могут реализовывать интерфейсы (interfaces).

Если не все здесь вам знакомо, — не волнуйтесь, продолжайте читать. Далее по тексту все объясняется и приводятся примеры (желательно иметь под рукой Flash MX 2004 или Flash MX Professional 2004.) (Скачать триал).

Объявление классов в файлах классов

Если вы не работали с языками типа Java или C#, то хранение каждого класса в его собственном файле вам пока незнакомо. Особенно, если вы работали только с ActionScript 1.0, в котором могли определять многочисленные классы в пределах единственного файла. Пофайловое хранение классов имеет свои плюсы. Главный — лучшая организация, из которой следует удобство хранения и распространения. Если пихать классы куда попало, хаос наступит быстро. Ясно, что при работе с 2-3 классами такой проблемы нет. Но ActionScript 2.0 вводит новую парадигму для ActionScript. Разработчики могут создавать и распространять библиотеки классов, содержащие неборы базовых функций. Просто чтобы колесо не изобреталось по нескольку раз в день в разных точках мира, а чтобы образовывалиь все более сложные механизмы из экземпляров одного хорошо продуманного колеса. Macromedia подает пример: посмотрите стандартные классы в каталоге First Run/Classes (и его подкаталогах) в той директории, где у вас установлена Flash MX 2004.

Итак, в отличие от классов ActionScript 1.0, все классы ActionScript 2.0 должны быть сохранены во внешних .as-файлах. Более того, имя файла должно совпадать с именем класса. Например, класс Car должен храниться в файле Car.as.

Работа с пакетами

Файлы классов можно хранить в пакетах (packages). Если вы не знакомы с пакетами (в мире .NET их называют простраствами имен (namespaces) то знайте, что это очень просто и удобно. Пакеты — это способ организации классов. Здесь есть два аспекта. Во-первых, в определении класса нужно указывать его пакет (об том будет подробнее). Во-вторых, .as-файл должен быть сохранен в соответствующей директории. Например, если пакет для класса — com.person13, то .as-файл для этого класса должен быть сохранен в директории com/person13.

Работа с пакетами тоже имеет преимущества. Наиболее очевидное: пакеты есть способ быстрой организации ваших файлов класса. Примеры найдете в классах, поставляемых вместе с Flash MX 2004 (в каталоге First Run/Classes). Вы увидите, что многие классы для UI-компонентов организованы в пределах пакета mx.controls и, следовательно, сохранены в директории mx/controls. Второе преимущество пакетов: они помогают избегать конфликтов имен. Вы не можете иметь два класса с одним и тем же именем в одном и том же пакете хотя бы той по очевидной причине, что путь к файлу класса должен быть уникальным. Так что если бы пакетов не было, вы бы столкнулись с такой проблемой очень быстро. Конечно, если вы сами пишете все классы, то вы можете дать каждому классу уникальное имя. Но когда вы загружаете и устанавливаете классы других разработчиков, ситуация может выйти из под контроля. А вот когда классы хранятся в пакетах, все становится на стои места. Например, класс Car в пакете com.person13 и класс Car в пакете com.ejepo никогда не подвергнутся опасности конфликта имен.

Указание пути к классам (classpath)

По умолчанию Flash ищет файлы классов в директории First Run/Classes. Если не находит там, то ищет дальше в директории вашего исходного fla-файла или документа ActionScript. Classpath — это список директорий, в которых Flash ищет файлы класса. Вы можете указать дополнительные директории для classpath или изменить порядок поиска файлов классов по директориям. Выберите меню Edit>Preferences, затем жмите закладку "ActionScript". Потом жмите "ActionScript 2.0 Settings". В открывшемся диалоге используйте кнопку с плюсом, чтобы добавить директорию и т.д. (Надеюсь, дочитавшим до этого места не нужно разжевывать назначение давно знакомых элементов интерфейса — прим перев.)


Рис. 1: определение списка classpath

На рис. 1 все хорошо видно. Мы добавили свою директорию D:\Swf\Classes. На то есть причины:

  • Легче найти на диске директорию типа D:\Swf\Classes, чем родную директорию, где Flash хранит файлы класса;
  • Лучше хранить свои классы отдельно от тех, что поставляются вместе с Flash.

Что такое Private и Public

Класс состоит из членов — свойств и методов. Доступ к членам класса может происходить в разных режимах (публично или приватно). Если вы не использовали некоторые изощренные или недокументированные возможности ActionScript 1.0, то все члены классов ActionScript 1.0 были публичными (public). Когда мы говорим, что член является публичным, это означает, что он доступен извне определения класса. Например, если вы создаете класс Car, а у него — свойство make, доступное из экземпляра класса Car, тогда это свойство является публичным. Но часто вы не хотите, чтобы свойства и методы класса были публично доступны. Класс может иметь свойства и переменные, которые используются только непосредственно внутри него. В таких случаях, вы можете объявить, что член будет приватным (private).

Примечание: приватный член класса в ActionScript 2.0 ведется себя подобно защищенному (prtotected) члену в языках типа Java или C#.

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

private var _nInterval:Number;

Согласно общепринятым соглашениям, можно начинать имя приватного свойства с символа подчеркивания, чтобы легче было отличать его "неприватных" переменных.

Мы рассмотрим объявление публичных и приватных членов далее в этом разделе. На примерах все станет намного понятнее (мы создадим собственный класс).

Примечание: Если не указан режим доступа (публичный или приватный), то считается, что член публичный.

Что такое статические члены класса

Статические члены класса доступны непосредственно из класса, а не из его экземпляров. Это не новое понятие из ActionScript 2.0. Фактически, начиная с Flash 5, появились встроенные классы со статическими членами. Например, класс Math полностью состоит из статических членов. Доступ к свойствам и методам производится непосредственно из класса, без создания экземпляра. Например:

trace(Math.cos(3.14));
Заметьте, что метод cos() доступен прямо из класса Math, так как это — статический метод. Чтобы создать статический член в классе ActionScript 2.0, используйте при объявлении ключевое слово static. Кстати, статические члены, как и не-статические, могут быть публичными или приватными. Вот пример объявления публичного статического члена:

public static var classname = "Car";

Объявление класса

Упрощенно, класс состоит из таких частей:

  • Объявление класса, состоящее из ключевого слова class и имени класса;
  • Объявления свойств;
  • Объявление конструктора;
  • Объявления методов.

Объявление класса

Используйте ключевое слово class и следующее за ним имя класса. Затем следует определение класса, заключенное в фигурные скобки. Например:

class Car {
// Определение класса
}

Если вы включаете класс в пакет, то при объявлении нужно включить имя пакета в имя класса. При вызове класса нужно использовать его полное имя, с включенным в него именем пакета. Например, если класс Car содержится в пакете com.person13, то объявление класса должно быть таким:

class com.person13.Car {
// Определение класса
}

И, конечно, при помещении класса в пакет нужно сохранять файл в соответствующем каталоге. В случае с com.person13.Car файл класса Car.as должен быть в каталоге com/person13, (а директория com размещена там, куда указывает classpath. (Например, если ваш classpath включает D:\Swf\Classes, то вы можете сохранить файл класса в D:\Swf\Classes\com\person13\Car.as.)

Объявления свойств

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

class com.person13.Car {

private var _sMake:String;
private var _sModel:String;
private var _nYear:Number;
private var _nMiles:Number;
private var _nInterval:Number;

// Остальные определения класса.

}

Объявление конструктора

После объявления свойств класса нужно объявить конструктор. На самом деле, если вы не объявите конструктор явно, Flash сама создаст пустой конструктор. Но даже если ваш конструктор ничего не делает, все равно желательно объявлять его явно. Помните, что конструктор является специальным методом, его имя совпадает с именем класса. Конструктор используется при создании экземпляров. Конструктор должен быть объявлен как обычная функции, и даже если он принимает параметры, он не должен возвращать никакой величины. Вот пример класса Car с конструктором:

class com.person13.Car {

private var _sMake:String;
private var _sModel:String;
private var _nYear:Number;
private var _nMiles:Number;
private var _nInterval:Number;

function Car(sMake, sModel, nYear, nMiles) {

_sMake = sMake;
_sModel = sModel;
_nYear = nYear;
_nMiles = nMiles;

}

// Остальные определения класса.

}

В отличие от некоторых других языков, в ActionScript 2.0 конструкторы не перегружаются.

Объявление методов

Затем можно объявить методы вашего класса. Объявление методов подобно объявлениям стандартных функций. Используется ключевое слово function и тот же синтаксис. Помните, что метод является функцией, но связан классом. Но поскольку вы объявляете эту функцию в пределах класса, Flash понимает, что ее нужно связать с классом. Единственное различие между стандартными функциями и методами — это то, что вы можете объявить методы как публичные, приватные или статические. Вот пример того же самого класса Car с двумя методами — публичным и приватным:

class com.person13.Car {

private var _sMake:String;
private var _sModel:String;
private var _nYear:Number;
private var _nMiles:Number;
private var _nInterval:Number;

function Car(sMake, sModel, nYear, nMiles) {

_sMake = sMake;
_sModel = sModel;
_nYear = nYear;
_nMiles = nMiles;

}

public function drive(nMPH:Number):Void {

if(nMPH == null || nMPH == 0) {

clearInterval(_nInterval);

}
else {

_nInterval = setInterval(this, "increment", 1000, nMPH);

}

}

private function increment(nMPH:Number):Void {

_nMiles += nMPH;

}

}

Работа с геттерами/сеттерами

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

  • Они позволяют работать со свойствами типа _nMiles, снаружи класса обращаясь к ним через простое имя типа miles;
  • Они позволяют создавать свойства "только для чтения" или "только для записи";
  • Они позволяют создавать виртуальные свойства — т.е. такие, которые не сопоставлены ни одному из реальных свойств класса, а образовываются динамически как результат обработки неких внутренних значений.

Геттер-метод никогда не принимает параметров и всегда возвращает некое значение. Синтаксис геттер-метода:

function get внешнееИмяСвойства():типВозвращаемогоРезультата {

// Определение метода, включая выражение return.

}

Геттер-метод может, как и другие методы, обладать разными режимами доступа, для чего применяются те же ключевые слова public, private или static. Вот пример простого геттер-метода, который возвращает значение внутреннего свойства класса _nMiles как доступное снаружи класса свойство miles.

public function get miles():Number {

return _nMiles;

}

Синтаксис для сеттер-метода очень похож на синтаксис для геттер-метода за исключением того, что он всегда принимает параметр, никогда не возвращает значения и использует ключевое слово set вместо get. Вот базовый синтаксис:

function set внешнееИмяСвойства(имяПараметра:типДанных):Void {

// Определение метода.

}

И так же, как и в случае с геттер-методом, вы можете использовать модификаторы public, private и static, устанавливающие соответствующий режим доступа с сеттеру. Вот пример сеттер-метода, который связывает новое значение с приватным свойством _nMiles. Заметьте, что он проверяет значение на валидность (должно больше или рано нулю). Если это не так, используется значение по умолчанию 0.

public function set miles(nMiles:Number):Void {

if(nMiles >= 0) {

_nMiles = nMiles;

}

else {

_nMiles = 0;

}

}

Импорт классов

Когда вы помещаете классы в пакеты, нужно в ссылках на этот класс всегда использовать полное имя класса. Это означает, что если вы создали класс com.person13.Car, то для создание экземпляров этого класса конструктор должен быть написан следующим образом:

var car:com.person13.Car = new com.person13.Car("Oldsmobile", "Alero", 2000, 43000);

Хотя можно создать и ярлык для класса. Можно использовать выражение import, чтобы сообщить Flash, о каких пакетах и классах он должен "знать", чтобы вам не приходилось каждый раз включать имя пакета в имя класса. После этого Flash будет автоматически добавлять имя пакета, а вы о нем можете не тревожиться. Вот простой пример с импортом класса Car и созданием его экземпляра:

import com.person13.Car;
var car:Car = new Car("Oldsmobile", "Alero", 2000, 43000);

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

При импорте классов из пакета можно использовать символ звездочки (*). Например, следующий код импортирует все классы из пакета com.person13:

import com.person13.*;

Создание класса

Конец теории, практикуем создание собственного класса. Начнем с создания класса Car:

  1. Откройте новый ActionScript-файл. Если вы используете Flash MX Professional 2004, то вы можете воспользоваться встроенным в среду разработки редактором ActionScript. В противном случае вы можете использовать ваш любимый текcтовый редактор;
  2. Начнем с объявления класса. Используем ключевое слово class, со следующим за ним именем класса. Затем в фигурных скобках — определение класса:

    class com.person13.Car {

    }

  3. Затем объявим пять приватных свойств. Первые четыре довольно очевидны, а последнее свойство используется для хранения ID интервала вызова метода, который будет определен далее в методах.

    class com.person13.Car {

    private var _sMake:String;
    private var _sModel:String;
    private var _nYear:Number;
    private var _nMiles:Number;
    private var _nInterval:Number;

    }

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

    class com.person13.Car {

    private var _sMake:String;
    private var _sModel:String;
    private var _nYear:Number;
    private var _nMiles:Number;
    private var _nInterval:Number;

    function Car(sMake, sModel, nYear, nMiles) {

    _sMake = sMake;
    _sModel = sModel;
    year = nYear;
    miles = nMiles;

    }

    }

  5. Затем следует объявление методов класса. Сейчас мы создадим публичный метод drive(). Затем мы также создадим приватный метод increment(), который будет вызываться в интервале при вызове метода drive().

    class com.person13.Car {

    private var _sMake:String;
    private var _sModel:String;
    private var _nYear:Number;
    private var _nMiles:Number;
    private var _nInterval:Number;

    function Car(sMake, sModel, nYear, nMiles) {

    _sMake = sMake;
    _sModel = sModel;
    year = nYear;
    miles = nMiles;

    }

    public function drive(nMPH:Number):Void {

    if(nMPH == null || nMPH <= 0) {

    // Если nMPH = null или меньше/равно 0
    // то останавливаем автомобиль
    // путем очистки интервала
    clearInterval(_nInterval);

    }
    else {

    // В противном случае
    // устанавливаем интервал, раз в секунду
    // вызывающий приватный метод increment()
    _nInterval = setInterval(this, "increment", 1000, nMPH);

    }

    }

    private function increment(nMPH:Number):Void {

    // Каждый раз при вызове методв обновляем значение _nMiles,
    // прибавляя к нему nMPH.
    _nMiles += nMPH;

    }

    }

  6. Осталось задать геттер/сеттер методы:

    class com.person13.Car {

    private var _sMake:String;
    private var _sModel:String;
    private var _nYear:Number;
    private var _nMiles:Number;
    private var _nInterval:Number;

    function Car(sMake, sModel, nYear, nMiles) {

    _sMake = sMake;
    _sModel = sModel;
    year = nYear;
    miles = nMiles;

    }

    public function get make():String {

    return _sMake;

    }

    public function get model():String {

    return _sModel;

    }

    public function get year():Number {

    return _nYear;

    }

    public function set year(nYear:Number):Void {

    if(nYear >= 1886) {

    _nYear = nYear;

    }
    else {

    _nYear = 1886;

    }

    }

    public function get miles():Number {

    return _nMiles;

    }

    public function set miles(nMiles:Number):Void {

    if(nMiles >= 0) {

    _nMiles = nMiles;

    }
    else {

    _nMiles = 0;

    }

    }

    public function drive(nMPH:Number):Void {

    if(nMPH == null || nMPH <= 0) {

    clearInterval(_nInterval);

    }
    else {

    _nInterval = setInterval(this, "increment", 1000, nMPH);

    }

    }

    private function increment(nMPH:Number):Void {

    _nMiles += nMPH;

    }

    }

  7. Сохраните файл в директории "com/person13" (с учетом пути к классам (classpath)). Например, если ваш путь к классам включает D:\Swf\Classes, то сохраняйте в D:\Swf\Classes\com\person13;
  8. Откройте новый Flash-документ (.fla).
  9. В первом кадре главного таймлайна добавьте следующий код ActionScript:
    import com.person13.Car;

    // Функция отображения длины проделанного пути в милях объекта Car
    function displayMileage(carObj:Car):Void {

    trace(carObj.miles);

    }

    // Создаем объект Car
    var car:Car = new Car("Oldsmobile", "Alero", 2000, 43000);

    // Начинаем ехать со скоростью 65 миль в час
    car.drive(65);

    // Устанавливаем интервал для периодического показа пройденного пути
    setInterval(displayMileage, 100, car);

  10. Тестируем клип.

Вы увидите результат в панели Output.

Вывод

Мы рассмотрели основы работы с классами в ActionScript 2.0. На самом деле это еще не все: мы пока не затрагивали расширение классов (extending) и реализацию интерфейсов классов (interfaces). Эти темы будут рассмотрены в третьей части этой статьи, и так уже слишком длинной. Спасибо за вдумчивое чтение и в добрый путь по флэш-океану :-]

Автор: Joey Lott (www.person13.com)

Писал: Rost, 15 Сентябрь 2003 12:35

Комментарии:

Ура! OOP в AS2 стало более подобное OOP в других языках :) ..Работа с классами практически повторяет синтаксис Jav ( интересный подход ). Так что появилась новая конструкция для создания классов :)

ВАМ БОЛЬШОЕ СПАСИБО! До 3ей "золотой" части :)
Удачи..

Sultan - 16 Сентябрь 2003 14:22

УРАУРАУРАУАР
это уже не флеш
5 флеш- это флеш, а это флеш + java
хотя что такое флеш?

это прежде всего совместимость, тормоза, векторная графика и труляля

Ostap - 16 Сентябрь 2003 15:21

Спасибо Joey Lott, спасибо Рост :), грамотная статья...

Dolbyzerr - 16 Сентябрь 2003 16:09

Ростик, ты чего на потрошителе главную страницу статьёй забил ? :)), сдурел совсем?

Olka - 16 Сентябрь 2003 16:58

Рост -- ты просто молодец.
Твое упорство в работе на благо родины -- заслуживает высшей меры пахлавы.
Удачи тебе, -- во всем. :)

MSA - 16 Сентябрь 2003 22:37

Да - Macromedia теперь разделила всех на програмеров и дизайнеров.
Теперь будет четко видно, если у тебя логическое
мышление то иди "обьектай"
Если образное то рисуй и компонуй.
А вот что будет если они сюда еще и UML внедрят?

Андрей - 19 Сентябрь 2003 14:08

Хороший перевод!

Хотелось бы отметить, что по науке "геттеры" - это "аксесоры", а "сеттеры" - это "мутаторы".

А UML уже внедрили :) gModeler.org

Всем привет :)

Cloud:9: - 16 Декабрь 2003 9:49

Пришли пожалуйста флеш библиотеки

Дима - 29 Январь 2004 16:53

кстати и на обычный C++ флаш теперь тоже похож, хотя точно сказать есть ли там отдельно пакеты я немогу, а вот namespaces (с похоже ролью) однозначно присутствуют.

А про деструкторы че умолчал? или во Флэше их нет, надо обязательно глянуть.

Hyzhak - 29 Январь 2004 18:59

клевааааааааа!!!!!!!!!я теперь умнее стал!!!!!!!!

assimetric - 11 Январь 2005 15:54

Спасибо!

OmeO - 9 Июнь 2005 9:10

Ну статья класс, я то вот сидел, читал книжку по AS1, про ООП и офигевал...стал писть как написана, потом нейчайна узнал что тут классы нормальные есть)), почитал статейку и Крута, я прям счастлив) переписал все...
ps : Расскажи, убей, но живи, дыши - вот тебе закон!

sLetix - 14 Июнь 2005 21:23

Классы в AS2 это конечно хорошо. Но это только верхняя часть айсберга:
- нельзя перегружать ни конструктор, ни методы,
- модификаторы доступа используются только на этапе компиляции :(, напр:
var item1:MyClass = new MyClass();
var item2:Object = item1;
item2.somePrivateMethod();
item.somePrivateField = someValue;
- типизация только на этапе компиляции,
- и т д... :(
а статья хорошая, спасибо! :)

PIL - 13 Март 2006 14:29

PIL, спасибо, и обрати внимание, что уже AS3 на пороге топчется :)

Рост - 13 Март 2006 14:33

спасибо за статью )

Rendy - 23 Март 2006 8:22

Cексуальная и ласковая, нежная и пушистая, страстная и дикая как кошка. Доставлю тебе незабываемое ощущение. Страстная и нежная, милая и ласковая, покорная и дикая, развратная и скромная. И это все - Я!!! Приезжай ко мне в гости. Есть подружка.... Фото и телефон на сайте http://seo-root.org.ru

mnllppj - 12 Январь 2007 22:27

http://fugura.exactpages.com/modifica59.html maga
http://fugura.exactpages.com/modifica67.html sedile
http://fugura.exactpages.com/modifica20.html casto
http://fugura.exactpages.com/modifica50.html terremoto
http://fugura.exactpages.com/modifica78.html labile
http://fugura.exactpages.com/modifica11.html vittoria
http://fugura.exactpages.com/modifica30.html estrazione
http://fugura.exactpages.com/modifica10.html funzioni
http://fugura.exactpages.com/modifica79.html potenziometri
http://fugura.exactpages.com/modifica12.html nettare
http://fugura.exactpages.com/modifica72.html animati
http://fugura.exactpages.com/modifica28.html magi
http://fugura.exactpages.com/modifica42.html sicuro
http://fugura.exactpages.com/modifica68.html parrucca
http://fugura.exactpages.com/modifica58.html avidita
http://fugura.exactpages.com/modifica80.html cappellani
http://fugura.exactpages.com/modifica75.html valutazioni
http://fugura.exactpages.com/modifica13.html sparare
http://fugura.exactpages.com/modifica52.html mandibola
http://fugura.exactpages.com/modifica6.html mostra

alexei - 25 Июнь 2007 16:40



Подписаться на новости (RSS)




Примечания:
Статус документа
: в процессе
   2002-2009 Производство: Ростислав Сирык · О проекте · Подписка на новости (RSS)