Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Статьи (http://www.flasher.ru/forum/forumdisplay.php?f=101)
-   -   ActionScript 3 с нуля (http://www.flasher.ru/forum/showthread.php?t=92301)

DRAGOnoid 21.02.2007 13:33

ActionScript 3 с нуля
 
Извините если поднял ненужный вопрос - просто хотел бы создать топик в котором можно было бы сконцентрировать вопросы ну уж совсееем для тех кто не в теме.

При необходимости можете удалить тему...

Ну так вот - тема AS3 относительно молодая. Это видно хотя бы потому что документаций и примеров по ней не так и много, можно сказать практически нет.

но а что есть - не совсем понятно что для чего и откуда берётся.

Если позволите я буду задавать совсем глупые вопросы - которые возможно бы пролили свет на то что происходит...

итакс начну.
Поставил 9ю версию флеша, настроил Паблик на AS3 и открываю окно программирования.

первое что хочу сделать - написать 'Приветище мир!'
пишу
Код:

trace ("Приветище мир!");
жму Ctrl+Enter
работает!

натыкаюсь на пример в инете:
Код:

package main {
    import flash.display.Sprite;
 
    public class test1 extends Sprite {
          public function test1() {
                trace("Hello World");
          }
    }
}

пример взят отсюда http://www.timezero.ru/storm/

вот тут меня и понесло задавать вопросы...
например что ещё за package?
для чего нужна строчка ?
import flash.display.Sprite;
и что она означает ?

как разобраться с классами если раньше с ними никогда не работал
public class test1 extends Sprite { }
тем более что слов много и непонятно что для чего
и функция тоже
public function test1() { }
вроде как всё знакомо но непонятно какои образом она вызвалась, или как вызвался класс....
В общем совсем ничего не понятно....

я так же пытался почитать http://livedocs.adobe.com/flex/201/langref/index.html
но там тоже только описание операторов, но простейших примеров как они работают нет. Догадайся мол сам =(

baron27 21.02.2007 13:37

по-моему тебе нужно начать с теории ООП, почитав Мука.

DRAGOnoid 21.02.2007 13:56

а ссылка есть? :)
или где купить

кстати понятие классов и функций я имею, использовал их как в AS2 так и в PHP (было немного на DELPHI) но тут чё то немогу никак разобраться....

DRAGOnoid 21.02.2007 17:25

пошаманив немного с примерами - кое что стало немного ясно.
как известно поле Document class сделанно для того чтобы присвоить в него основной класс.
в этом случае код класса пишется в отдельном *.as файле.
а в Document class пишется путь к этому файлу.
путь выглядит следующим образом main.fff.ggg
где main это папка лежащая в той же директории где наш *.fla файл
fff - папка лежащая в папке main, а ggg - это имя нашего файла *.as лежащая в папке fff. т.е. получается путь к ggg.as
всё верно?
(хотя остаются вопросы как перейти в другие уровни и т.д. - но до этого пока щас не дошёл).

да ещё заметил что поле *.fla файла обязательно должно оставаться пустым - иначе возникает ошибка (даже если просто коментарий написать) - почему?
То же самое касается и сцены - в ней тоже не должно ничего быть иначе вылезает ошибка.

Второе что интересует как быть с встроенным программным полем fla ? там работают простые примеры типа trace(); математика, определение параметров объектов и т.д. А как например мне сделать autoSize к динамическому полю?
http://livedocs.adobe.com/flex/201/l....html#autoSize

etc 21.02.2007 17:47

Код в кадрах в девятом флеше не пишется.

http://as3.ru/?p=14

Dendroid 21.02.2007 18:55

А почему бы Вам сперва не прочитать статью многоуважаемого Мерлина http://www.timezero.ru/storm/page1.html, где на конкретном примере показано что, куда и зачем в AS3?

Тема с обсуждением так и называется: "Знакомство с Actionscript 3" и находится 10 строчками ниже. http://flasher.ru/forum/showthread.php?t=83431

DRAGOnoid 21.02.2007 21:04

пример с Timezero просто восхитителен!
Но архитектура не сразу ясна....
я же как раз и сравнивал изначально 2 примера - Hello World c timezero и свой старый бытовой.
http://as3.ru/?p=14 - сильно похож на код с таймзеро (и кстати там я тоже откоментировался об небольшой поправке как DRAGON )

в таймзеро там некоторые мелочи опускают - вот я их и хотел бы уточнить.
например что есть package main { } ?
и как оно работает?
из всего текста я полнял что import - это своего рода добавление библиотеки. (зачем такая сложность?) к тому же как я понял в SWF или плугине FLASH всёравно запускаются все эти библиотеки.

etc 21.02.2007 21:32

package main всего лишь означает, что класс находится в пакете main и всё.

Если ты писал на AS2, то не понимаю, откуда такие вопросы возникают.

MerlinTwi 22.02.2007 12:05

> например что есть package main { } ?
> и как оно работает?
см. здесь http://flasher.ru/forum/showpost.php...9&postcount=93

> из всего текста я полнял что import - это своего рода добавление библиотеки.
да, http://flasher.ru/forum/showpost.php...6&postcount=86
> (зачем такая сложность?)
этот вопрос меня тоже беспокоит :) теоретически Flash мог бы и сам найти нужные классы. Может для порядку? Как, например, ввели обязательно писать override при переопределении метода класса, чтобы случайно не заменить уже существующий. Так возможно и здесь, если ты не написал import а пытаешься использовать класс, так может это просто опечатка в имени класса?

> к тому же как я понял в SWF или плугине FLASH всёравно запускаются все эти библиотеки.
нет, в SWF будут встроены только те библиотеки, которые были указаны в import.
Кстати еще один прикол, если включить Strict mode (http://flasher.ru/forum/showpost.php...postcount=101), написать в классе import чего-либо, что в классе не используется, то компилятор на это ругается, типа чего объявить объявил а не используешь, вот только текст ошибки сбивает с толку, там говорится не могу найти объявленный класс :)

> как разобраться с классами если раньше с ними никогда не работал
> public class test1 extends Sprite { }
> тем более что слов много и непонятно что для чего
про много слов см. тут http://flasher.ru/forum/showpost.php...66&postcount=9

> и функция тоже
> public function test1() { }
> вроде как всё знакомо но непонятно какои образом она вызвалась,
Если функция названа так же как класс - это конструктор, который вызывается автоматически при создании класса

> или как вызвался класс....
он был записан в поле Document class, см. тут http://flasher.ru/forum/showpost.php...0&postcount=77

> да ещё заметил что поле *.fla файла обязательно должно оставаться
> пустым - иначе возникает ошибка (даже если просто коментарий написать) - почему?
> То же самое касается и сцены - в ней тоже не должно ничего быть иначе вылезает ошибка.
Потому что размещенные на сцене объекты будут встроены в рутовый класс (Document class) а если этот класс не объявлен как динамический (dynamic), то в него нельзя ничего динамически добавить, потому и возникает ошибка. Добавь слово dynamic в описание рутового класса и все будет ok.

> Второе что интересует как быть с встроенным программным полем fla ?
см. тут http://flasher.ru/forum/showpost.php...1&postcount=33

etc 22.02.2007 12:21

import в AS3 работает именно как импорт, т.е. зашивает всё-таки классы.

BlooDHounD 22.02.2007 13:54

> import в AS3 работает именно как импорт, т.е. зашивает всё-таки классы.

Враньё :) он делает их видимыми :) ничего он не зашивает. проверял. неиспользуемые классы он не зашивал.

>> (зачем такая сложность?)
>этот вопрос меня тоже беспокоит

тут всё проще у тя могут быть 2 класса с одинаковыми названиями, в разных пакетах. Практика конечно плохая, но впринципе может быть такая ситуация.

Nirth 24.02.2007 08:49

Цитата:

этот вопрос меня тоже беспокоит теоретически Flash мог бы и сам найти нужные классы. Может для порядку? Как, например, ввели обязательно писать override при переопределении метода класса, чтобы случайно не заменить уже существующий. Так возможно и здесь, если ты не написал import а пытаешься использовать класс, так может это просто опечатка в имени класса?
По моему все логично, очень часто при разработке приложений используются third party компоненты\библиотеки, или банально куча разработчкиков (сейчас в проекте который я делаю, их несколько десятков).

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

Хотя фасадным* классам, конечно стоит пытатся всегда придумывать уникальные имена. С утилитарными\внутреними классами фасады можно не церемонится.

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

DRAGOnoid 20.07.2007 16:18

поидее пакет package может содержать в себе несколько классов, однако у меня что то не получилось. Я пытаюсь делать так:

есть text.fla и там в Document class прописываю parseXML

содержимое parseXML.as:
Код:

package {
    import flash.display.MovieClip;
    import flash.events.*;

    public class parseXML extends MovieClip {

public function parseXML () {
trace ("привет");
}
}
class ListItem {
public function ListItem () {
trace ("хай!");
}
}

выдаёт ошибку
5006: An ActionScript file can not have more than one externally visible definition: parseXML, ListItem

как правильно делать?

WindWalker 20.07.2007 16:43

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

Вариант 1. Каждый класс - в отдельный файл.
Это если обязательно надо сделать два или более публичных классов.

Вариант 2. Одному классу пишешь public, всем остальным - private
Это если дополнительные классы нужны только для внутренней реализации и никому больше знать про них не надо.


В твоём случае, насколько я понимаю, лучше первый вариант, так как ты наверняка захочешь обратиться ListItem где-то ещё.

etc 20.07.2007 16:45

См. директиву internal.

DRAGOnoid 20.07.2007 17:02

пытаюсь делать как вы советуете - но что то не получается. Вот 2 способа в одном

test.fla = пишу "Parse"

содержимое Parse.as:
Код:

package {
        import flash.display.*;
        //import flash.events.*;
        //import flash.net.*;
        //import flash.text.*;
       
        import ListItem;
       
        public class Parse extends MovieClip {
                public function Parse() {
                        var vv:ListItem = new ListItem();
                }
        }
        private class Item {
                public function Item () {
                        trace ("хай!");
                }
        }
}

содержимое ListItem.as:
Код:

package {
        import flash.display.*;
        import flash.events.*;
        import flash.text.*;
       
        public class ListItem extends MovieClip {
                public function ListItem () {
                        trace ("класс подцепился");
                        // создаю текстфилд
                        var formatter:TextFormat        = new TextFormat();
                        formatter.font                = "Comic Sans MS";
                        formatter.size                = 14;
                               
                        var field:TextField                = new TextField();
                        field.selectable                = false;
                        field.embedFonts                = true;                       
                        field.defaultTextFormat        = formatter;
                        field.setTextFormat(formatter);
                        field.text                        = "Matchiupichiu66666666666";
                        field.autoSize                = TextFieldAutoSize.LEFT;
                        field.x = 10;
                        field.y = 10;
                        addChild(field);
                        trace (field);
                }
        }
}

в первом документе ругается на
Код:

        private class Item {
                public function Item () {
                        trace ("хай!");
                }
        }

и пишет
1013: The private attribute may be used only on class property definitions.

если его закоментировать то ругаться перестаёт и вроде даже как цепляет второй класс.. однако текстфилд почему то не создаётся :o Ой т.е. текстфилд создаётся но я его не вижу почему то.

DRAGOnoid 20.07.2007 17:13

такс, вторую ошибку решил - надо было просто догадаться передавать место куда addChild делать . Что-то типа этого

Код:

var vv:ListItem = new ListItem(this);

package {
        import flash.display.*;
        import flash.text.*;
       
        public class ListItem extends MovieClip {
                public function ListItem (mc) {
---------------------\\-------------------
                        mc.addChild(field);
                }
        }
}

но второй класс в общий пакет так и не получилось вставить :(

DRAGOnoid 24.07.2007 12:42

решил проблему сам. просто надо было внимательней смотреть на пример
http://flasher.ru/forum/showpost.php...17&postcount=8

есть пакет есть главный класс в этом пакете.. ОСТАЛЬНЫЕ КЛАССЫ ПИСАТЬ ВНЕ ПАКЕТА! (т.е. после "package {}") - вот в чём я стормозил... =)

DRAGOnoid 24.07.2007 13:37

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

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

Код:

package {
        import flash.display.*;       
        public class Parse extends MovieClip {
                public function Parse() {
                        var mc:Item = new Item();
                        addChild(mc);
                        mc.x=100;

                }
        }
}
class Item {
        import flash.display.*;
       
        private var size:uint        = 80;
        private var bgColor:uint      = 0xFFCC00;
        private var borderColor:uint  = 0x666666;
        private var borderSize:uint  = 0;
        private var cornerRadius:uint = 9;
        private var gutter:uint      = 5;               
        public function Item ():MovieClip {//:void
                trace ("хай!");
                var mc = doDrawCircle();
                return mc;
        }

        // просто рисую круг (взят из примера)
        private function doDrawCircle():MovieClip {
                var mc:MovieClip        = new MovieClip();
                var halfSize:uint        = Math.round(size / 2);
                var child:Shape                = new Shape();               
                child.graphics.beginFill(bgColor);
                child.graphics.lineStyle(borderSize, borderColor);
                child.graphics.drawCircle(halfSize, halfSize, halfSize);
                child.graphics.endFill();
                mc.addChild(child);
                return mc;
        }
}

но при попытке написать public function Item ():MovieClip { выдаёт ошибку 1130: A constructor cannot specify a return type.. Почему?

etc 24.07.2007 13:43

Конструктор класса не есть метод, возвращающий чего-либо.
Что помешало наследовать Item от MovieClip и рисовать всякую ботву прям в конструкторе?

DRAGOnoid 24.07.2007 13:58

удалите копию сообщения пожалуйста а то сдублировалось что то :rolleyes:
Цитата:

Сообщение от __etc
Конструктор класса не есть метод, возвращающий чего-либо.

ухху - записал ;)
Цитата:

Сообщение от __etc
Что помешало наследовать Item от MovieClip и рисовать всякую ботву прям в конструкторе?

ничто не помешало, наоборот я так и хотел. просто незнал как =)

Спасибо что то получилось :victory:
буду копаться, на данный момент вопросов пока нету.

DRAGOnoid 24.07.2007 14:02

ах да, забыл ещё вот что спросить.
пока рабочий код получился следующим
Код:

package {
        import flash.display.*;
       
        public class Parse extends MovieClip {
                public function Parse() {
                        var mc = new Item();
                        addChild(mc);
                        mc.x=100;
                }
        }
}
import flash.display.*;
class Item extends MovieClip {
        private var size:uint        = 80;
        public function Item ():void {
                trace ("хай!");
                var halfSize:uint        = Math.round(size / 2);
                var child:Shape                = new Shape();               
                        child.graphics.beginFill(0xFFCC00);
                        child.graphics.lineStyle(3, 0x666666);
                        child.graphics.drawCircle(halfSize, halfSize, halfSize);
                        child.graphics.endFill();
                        addChild(child);
        }
}

но меня пока терзает тот факт что приходится в одном документе 2 раза вызывать import flash.display.*; :confused:
можно его куда нить пихнуть 1 раз так, чтобы не package ни class Item не ругались?

etc 24.07.2007 14:05

Нет, необходимо сделать это дважды.

DRAGOnoid 24.07.2007 14:06

ладненько - ещё раз спасипки :victory:

DRAGOnoid 24.07.2007 14:25

ещё такой вопрос созрел.
как известно в классе есть свои методы и параметры.
мытоды вызывают внутренние функции которые что то делают.
например
Код:

var mc = new Item();
addChild(mc);
mc.setText('привет');

этот метод вызывает внутреннюю функцию, которая вставляет текст внутрь
Код:

public function addText(text:String) {
this.txt.text = text;
}

(это просто пример - я конечно предполагаю что можно просто через public задавать параметры извне, но я другое хочу).
Возможно ли сделать такой параметр, который бы работал как метод. т.е. писать не mc.setText('привет'); а mc.setText = 'привет'; (этот вопрос меня интересовал ещё с двойки)

etc 24.07.2007 14:38

Нужно использовать сеттер.

Код:

public function set text(value:String):void {
    this.txt.text = value;
}

Код:

mc.text = 'hello';

DRAGOnoid 24.07.2007 14:55

вах! Здорово! Спасибо !!!

DRAGOnoid 30.07.2007 12:39

такой вопрос. Попробую объяснить понятно =)

есть некоторое клетчатое поле, в каждой клетке могут быть несколько мувклипов. само поле имеет 2.5D проекцию
http://dragonnoid.ru/images/2.5D.JPG

Так вот, на каждой клетке может быть по несколько мувклипов (пользователей обычно для FLASH-чата) сами мувклипы привязанны к двумерному массиву.
1) можно ли как то узнать самый верхний мувклип? и добавить новый поверх него или изменить текущий с его позицией
2) привязать как то положение мувклипов к координате Y так, чтобы выше был тот, чья координата Y меньше
3) может есть более логичный и лёгкий способ? :rolleyes:

miramax 30.07.2007 13:10

Я бы попробовал примерно вот такие глубины вложенности:
Код:

              01
            02  03
          04  05  06
        07  08  09  10
      11  12  13  14  15
    16  17  18  19  20  21
  22  23  24  25  26  27  28


vapes 30.07.2007 13:59

Новый мувик поверх всех добавляецца так:
Код:

this.addChild(this.item1);
this.addChild(this.item2);
this.setChildIndex(this.item1,this.numChildren-1);


DRAGOnoid 30.07.2007 14:23

Цитата:

Сообщение от miramax
Я бы попробовал примерно вот такие глубины вложенности:
Код:

              01
            02  03
          04  05  06
        07  08  09  10
      11  12  13  14  15
    16  17  18  19  20  21
  22  23  24  25  26  27  28


да я когда прикидывал тоже был сначала склонен к этой системе, но более правильно делать так.
Код:

                  00
                01  10
              02  11  20
            03  12  21  30
          04  13  22  31  40

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

DRAGOnoid 31.07.2007 13:22

хочу спросить на счёт double Click

вот изначально рабочий код
Код:

package {
        import flash.display.*;
        import flash.events.*;
        public class Parse extends MovieClip {
                public function Parse() {
                        var item:Item        = new Item();
                        addChild(item);
                }
        }
}
import flash.display.*;
import flash.events.*;
class Item extends MovieClip {
        private var roundRect:Sprite        = new Sprite();
        private var mc:Sprite        = new Sprite();
        public function Item ():void {
                roundRect.addChild(drawRoundRect(0xEEEEEE));
                roundRect.doubleClickEnabled=true;
                roundRect.addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);

                addChild(roundRect);
        }
        private function onDblClick(evt:MouseEvent):void {
                trace("onDblClick");
        }
        private function drawRoundRect(color:Number):Shape {
                var child:Shape        = new Shape();
                        child.graphics.beginFill(color);
                        child.graphics.drawRoundRect(0, 0, 166, 23, 20);
                        child.graphics.endFill();
                return(child);
        }
}

но мне надо было сделать так (т.е. заставить работать на весь Item)
Код:

public function Item ():void {
                roundRect.addChild(drawRoundRect(0xEEEEEE));
                addChild(roundRect);
                doubleClickEnabled=true;
                addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);

        }

я ещё пытался всё это засунуть в 1 мувклип тоже не получилось
Код:

public function Item ():void {
                roundRect.addChild(drawRoundRect(0xEEEEEE));
                mc.addChild(roundRect);
                mc.doubleClickEnabled=true;
                mc.addEventListener(MouseEvent.DOUBLE_CLICK, onDblClick);

addChild(mc);
        }

как нужно делать правильно?

vapes 31.07.2007 14:31

Cделай класс Item унаследованный от Sprite(), пихай туда все что хочешь, а потом:
Код:

var item:Sprite = new Item();
item.addEventListener(...)

если захочешь написать обработчик внутри, то пиши this.addEventListener(...);

DRAGOnoid 31.07.2007 14:49

мне для упрощения работы хотелось сделать как раз второй вариант, но
второй вариант не сработал ни this.addEventListener(...);
ни просто addEventListener(...);

самый более меннее нормальный и рабочий вариант оставил первый, с той лишь разницей что делаю hit (с hit.alpha=0) Зону внутри Item() и на неё вешаю все Events.

кстати ЛОЛ - я сделай класс Item унаследованный от Sprite(), но внутри была анимация (движение текста) всё работает Оо теперь вообще непонимаю в чём разница между MovieClip и Sprite (уже делал пост на эту тему но очевидных отличий так и не вижу), методы и свойства всё те же.

etc 31.07.2007 14:53

У Sprite нет методов MovieClip и он меньше памяти потребляет.

DRAGOnoid 31.07.2007 16:34

Цитата:

Сообщение от __etc
У Sprite нет методов MovieClip и он меньше памяти потребляет.

Ну да я помню ты это писал. однако x, y, alpha, есть (и это хорошо, ачего нет то пока не использую) и даже анимацию крутить может...

кстати тут в тупик попал с этими слоями...
дело в том что я хотел при нажатии на какой нить из Item(); делать его поверх всех остальных... однако делать это хотел из самого Item(); пока ещё думаю как это сделать...

можно ли узнавать numChildren основного класса из Item(); ?

etc 31.07.2007 16:35

Я говорю про методы play, stop, gotoAndStop и т.п.
Узнать numChildren можно обратившись к parent.

vapes 31.07.2007 16:45

я делал так (счас тожа пытаюсь програмить на ас3 с использованием флексовского фреймворка):создавал массив Item'ов добавлял их в основной класс, кажый Item хранит в себе индекс массива. А потом на mouseClick Item диспатчил Event где еще передавал свой индекс. Подписавшись на этот Event основной класс вытаскивал его поверх всех.

DRAGOnoid 31.07.2007 17:00

клёво! для будущего поколения напишу что получилось
1) чтобы узнать numChildren - достаточно внутри вызываемой функции побочного класса написать
parent.numChildren
2) а чтобы узнать child номер слоя самого экземпляра (в моём случае Item()) достаточно написать
parent.getChildIndex(this)

а вот что в конечном счёте надо было мне
Код:

parent.swapChildrenAt (parent.getChildIndex(this), parent.numChildren-1);
спасибо за помощь! =) копаю дальше....

DRAGOnoid 04.08.2007 14:43

Здравствуйте! Вот принёс ещё несколько вопросов, если позволите.. :rolleyes:

первое что интересует - я хочу задействовать колёсико мыши (или он же Scroll). За эту функцию отвечает MouseEvent.MOUSE_WHEEL. Хочу отслеживать на всей флешке, пишу:
Код:

addEventListener(MouseEvent.MOUSE_WHEEL, m);
private function m (event:MouseEvent):void {
trace(event);
}

Ctrl+Enter = непашет. Думаю хмм.. что не так... поставил вместо MOUSE_WHEEL - MOUSE_DOWN, заработало но, только если я кликаю на какой то предмет (на пустоту неработает) ставлю обратно MOUSE_WHEEL. Хотя нигде MOUSE_DOWN не стоит, но MOUSE_WHEEL заработает только если ты хотя бы 1 раз тыкнешь на какой нить предмет (и причём неважно какой), тогда заработает.
Вот собственно и первый вопрос - как мне сделать нормальный MOUSE_WHEEL?

Второе что интересует, так это всё та же больная тема с множеством муклипов на сцене :D

самый хороший способ это создать массив:
Код:

private var objects:Array = new Array();
а потом просто добавлять предмет привязываясь к нему:
Код:

var key = objects.length;
objects[key] = new Item(key, 6, 30, 0.3, 0.1);
objects[key].x=600;
objects[key].y=130;
field.addChild(objects[key]);

как видно из куска кода я передаю экземпляру предмета key, однако это не спасает в случае когда надо предмету самоудалиться. Первый случай я вызываю общую функцию в общем классе и она удаляет предмет, элемент массива и циклом for each переписывает ключи во всех предметах в соответствиис новыми key массива.

Нормальный способ самоудаления? или есть что по лучше?


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

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