Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   AS3 - начало. (http://www.flasher.ru/forum/showthread.php?t=99434)

Alexsas 06.08.2007 13:15

AS3 - начало.
 
Добрый всем день.
Сильно уж очень хочу AS3 изучать.. книг естественно еще по этому делу нету. Вообще-то я ко Flex тяготею, но почитав форум, стало ясно что вся сила Flex в As3. Да к тому же уже как то с тэгами этими всеми разобрался..

Но вот AS3 это засада... все только и твердят что стало легче программировать... но я пока в полном ацтое.. Помогите мне.

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

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

Имею вот такой вопросы.
1) Чем отличается класс который присоединяется ко всему документу от класса который аттачиться к любому мувику?
2) Можно ли все тело программы написать в главном классе? или же всегда необходимо к каждому мувику подключать класс для того что бы с ним что-то произошло?
3) У меня есть общее представление как все работает, но вот АЗОВ НАЧАЛА так сказать нету.. посоветуйте чего нибудь...

etc 06.08.2007 13:20

1) Тем, что это разные классы сами по себе, но наследуются от InteractiveObject;
2) Можно, но не стоит. Классы для того и придумали, чтобы разделять обязанности;
3) Вообще говоря перечисленных способов получения знаний должно было хватить. Конкретные вопросы можно задавать здесь.

Alexsas 06.08.2007 13:24

4) в чем разница: добавление компонента через редактор или же посредством написания кода?

etc 06.08.2007 13:28

А как вы его собираетесь добавить написанием кода? Откуда в библиотеке возьмуться классы для компонента и его визуальные части?

Alexsas 06.08.2007 13:36

Лучшее обучение это решение конкретных задач.
Для примера:

Имею в библиотеке два мувика: myPlates, и myCur.
Смысл задачи чтобы разместить на основном поле две копии myPlates, и чтобы при наведении на каждую из копий вид курсора менялся на myCur.

Я допустим сейчас даже незнаю какие классы на какие мувики вешать..
И какие библиоткеи классов импортировать.. но я попробую..

import.flash.events
import.flash.MovieClip

все? или нет.. разъясните пожалуйста

etc 06.08.2007 13:41

А можно исходник? А то лень собирать :)

Alexsas 06.08.2007 13:45

Вложений: 1
вот оно

etc 06.08.2007 13:59

Вложений: 1
Собственно, вот. Вопросы по реализации — велкам.

Alexsas 06.08.2007 14:32

давайте я попробую все расписать а вы меня поправите если что.
Код:

package {
// загружаем библиотеки того чего нам портебуется
        import flash.display.Sprite; // это для того чтобы задавать новые экземпляры нащих мувиков
        import flash.events.Event; // это для того чтобы были у нас события
        import flash.events.MouseEvent; // ну а это собственно мышыные события.
        import flash.ui.Mouse; // 1. что это??? (догодака.. библиотке отвечающая за мышиные поведения в интерфейсе)
       
        public class Example extends Sprite { //собственно наш класс...
               
                private var _cursor:MyCursor; //обявляем наш курсор курсором??
               
                public function Example() { // тело класса
                        super(); // что это?? обьясните
                        var place0:MyPlace = new MyPlace(); // обьявляем первый экз. нашего мувика
                        var place1:MyPlace = new MyPlace(); // второй.
                        this._cursor = new MyCursor(); // зачем это строка?
                        this._cursor.visible = false; // невидим курсор
                        this._cursor.mouseEnabled = false; // что это?
                        place1.x = 200; // второй ставим непадалеку...
                        place0.addEventListener(MouseEvent.MOUSE_OVER, this.mouseOverHandler); // мышка над обьектом вызываем функшин.
                        place1.addEventListener(MouseEvent.MOUSE_OVER, this.mouseOverHandler); // тоже самое для 2
                        place0.addEventListener(MouseEvent.MOUSE_OUT, this.mouseOutHandler); // мышка ушла вызывааем другой фуншин.
                        place1.addEventListener(MouseEvent.MOUSE_OUT, this.mouseOutHandler); // double
                        this.addChild(place0); // ну собственно делаем их
                        this.addChild(place1);
                        this.addChild(this._cursor);
                } // вопрос почему здесь везде this  ???
               
                private function mouseOverHandler(event:MouseEvent):void { // функция когда мышка над обьектом
                        Mouse.hide(); // прячем настоящий курсор
                        this._cursor.visible = true; // появляем наш.
                        this.addEventListener(MouseEvent.MOUSE_MOVE, this.mouseMoveHandler); // вот это я незнаю что за действие подозреваю что аналог start drag ????
                }
               
                private function mouseOutHandler(event:MouseEvent):void { // ну тут понятно.
                        Mouse.show();       
                        this._cursor.visible = false;
                        this.removeEventListener(MouseEvent.MOUSE_MOVE, this.mouseMoveHandler); // вот тут непонятно.
                }
               
                private function mouseMoveHandler(event:MouseEvent):void { // а становится понятно в чем штука...
                        this._cursor.x = event.stageX; // вот странная штука непонимаю..
                        this._cursor.y = event.stageY;
                        event.updateAfterEvent(); // ну это аля onEnterFrame ?
                }
        }
}

щас поглядим на другие классы

Код:

package {
       
        import flash.display.Sprite;
       
        public class MyCursor extends Sprite {
                public function MyCursor() {
                        super();
                }
        }
}

зачем это??? вот такие вот вопросы..

Обязательно ли всегда все классы начинать с package ?

etc 06.08.2007 14:42

Код:

package { // объявление пакета класса
        import flash.display.Sprite; // импорт класса Sprite, который мы будем активно использовать.
        import flash.events.Event; // импорт класса Event, который является базовым для всех событий.
        import flash.events.MouseEvent; // мышиный класс-наследник Event
        import flash.ui.Mouse; // с помощью класса Mouse скрываем и показываем курсор мыши
       
        public class Example extends Sprite {
               
                private var _cursor:MyCursor; // объявляем приватную переменную _cursor типа MyCursor. Она будет содержать ссылку на экземпляр MyCursor
               
                public function Example() { // конструктор класса
                        super(); // вызов конструктора супер-класса (в данном случае, Sprite), для Sprite вызов делать необязательно, но в целом так положено
                        var place0:MyPlace = new MyPlace(); // создаем первый экз. нашего мувика
                        var place1:MyPlace = new MyPlace(); // второй.
                        this._cursor = new MyCursor(); // создаем экземпляр MyCursor. Таким образом, мы можем обращаться к this._cursor.
                        this._cursor.visible = false; // делаем его невидимым
                        this._cursor.mouseEnabled = false; // отключаем реакцию курсора на мышиные события
                        place1.x = 200; // второй ставим непадалеку...
                        place0.addEventListener(MouseEvent.MOUSE_OVER, this.mouseOverHandler); // подписываемся на событие MOUSE_OVER первого клипа
                        place1.addEventListener(MouseEvent.MOUSE_OVER, this.mouseOverHandler); // тоже самое для 2
                        place0.addEventListener(MouseEvent.MOUSE_OUT, this.mouseOutHandler); // подписываемся на событие MOUSE_OUT первого клипа
                        place1.addEventListener(MouseEvent.MOUSE_OUT, this.mouseOutHandler); // double
                        this.addChild(place0); // добавляем клипы в display list
                        this.addChild(place1);
                        this.addChild(this._cursor);
                } // вопрос почему здесь везде this  ??? // this — обращение к экземпляру данного класса (Example, то бишь). Можно не писать, но я пишу.
               
                private function mouseOverHandler(event:MouseEvent):void { // обработчик события MOUSE_OVER
                        Mouse.hide(); // прячем настоящий курсор
                        this._cursor.visible = true; // появляем наш.
                        this.addEventListener(MouseEvent.MOUSE_MOVE, this.mouseMoveHandler); // подписка событие MOUSE_MOVE (движение мыши)
                }
               
                private function mouseOutHandler(event:MouseEvent):void { // ну тут понятно.
                        Mouse.show();       
                        this._cursor.visible = false;
                        this.removeEventListener(MouseEvent.MOUSE_MOVE, this.mouseMoveHandler); // отписываемся от события MOUSE_MOVE (чтобы не гонять невидимый курсор без дела
                }
               
                private function mouseMoveHandler(event:MouseEvent):void { // обработчик движения мыши
                        this._cursor.x = event.stageX; // присваиваем собственному курсору глобальную координату настоящего курсора мыши
                        this._cursor.y = event.stageY;
                        event.updateAfterEvent(); // принудительная перерисовка экрана, потому как объект переместился, а следующий кадр ещё не был отрисован
                }
        }
}

Классы MyCursor, MyPlace можно было не создавать, попросив сделать это сам Flash CS3, т.е. сгенерировать автоматически. Но если нам понадобится какой-то дополнительный функционал, придется их писать.

Alexsas 06.08.2007 14:55

Спасибо __etc большое! Голова уже стала меньше болеть!.
Пойду потренируюсь.. наверняка возникнет еще куча вопросов..

Еще раз благодарствую...

artcraft 06.08.2007 15:13

про this
Код:

package {
        import flash.display.Sprite;
       
        public class Example extends Sprite {
               
                private var n:int=1;
// объявляем приватную переменную
                private var i:int=0; // объявляем ещё одну приватную переменную
               
                public function Example() { // конструктор класса
                        var n:int = 2; // локальная переменная с таким же именем как у приватной
                       
                        // внимание, вопрос: что теперь будет если написать trace(n);?
                        // проверить очень просто :~)

                        trace(n); // в оутпуте 2, значит это обращение к локальной переменной
                        // возникает справедливый вопрос:
                        // как достучаться до одноимённой переменной класса?

                        // ответ: всё просто:
                        trace(this.n); //1 - ура! работает.
                       
                        // теперь становится понятно зачем нужен this

                        // однако, если имна переменных не дублируются,
                        // то всё работает и без this
                        trace(i); // 0

                        // возникает последний вопрос:
                        // почему _еtc пишет этот this постоянно,
                        // и там где необходимо и там где можно пропустить?
                        // ответ: это хороший тон
                        // если код потом усложнится и появятся дубликаты переменных,
                        // то он будет избавлен от проблемм с этим связанных

                       
                }
        }
}


Alexsas 07.08.2007 13:19

вот такой вопрос возник.
если бы я создал два мувика не динамически а сам бы расставил их на поле взяв и библиотеки в этом случае мне надо было бы их добавлять и обьявлять?
Код:

var place0:MyPlace = new MyPlace();
var place1:MyPlace = new MyPlace();
...
this.addChild(place0);
this.addChild(place1);


etc 07.08.2007 13:21

Нет, ничего объявлять не нужно. И добавлять тоже, они и так в Display List уже.

Alexsas 07.08.2007 16:33

Код:

       
public class main extends Sprite {

                public function main() {// конструктор класса
                        super();// вызов конструктора супер-класса (в данном случае, Sprite), для Sprite вызов делать необязательно, но в целом так положено
                        var loader0:UILoader = new UILoader();
                        loader0.scaleContent = false;
                        loader0.source = "/item/1.swf";
                        //addChild(loader0);
                        loader0.x = 0;
                        loader0.y = 0;
                        loader0.addEventListener(MouseEvent.CLICK, this.mouseClick);// подписываемся на событие MOUSE_OVER первого клипа
                        this.addChild(loader0);// добавляем клипы в display list
                }// вопрос почему здесь везде this  ??? // this — обращение к экземпляру данного класса (Example, то бишь). Можно не писать, но я пишу.

                private function mouseClick(event:MouseEvent):void {
                        trace(loader0.x);
                }
        }
}

почему trace выдает ошибку: 1120: Access of undefined property loader0.

etc 07.08.2007 16:34

Имена классов должны начинаться с прописной.

Ошибка возникает, потому что loader0 является локальной переменной конструктора класса, а не его приватным свойством.

Alexsas 07.08.2007 16:51

тогда вопрос такой..
если я хочу сообразить вот такую конструкцию
Код:

var loader[i]:UILoader = new UILoader();
loader[i].scaleContent = false;
loader[i].source = "/item/"+nameItem[i];

мне надо это дела в конструкторе или делать функцию свойств??

и как все же мне добраться до loader0.x в функции mouseClick ???

etc 07.08.2007 16:57

Лучше в массив складывать загрузчики.

Alexsas 07.08.2007 16:59

спасибо за совет.... 8-)
но чтобы понять почему?? мне еще ого-го....

Alexsas 08.08.2007 09:27

укажите не ошибки.

Что есть: в папке лежат куча мувиков (или картинок)
Задача: разбросать хаотично эти мувики по полю.. и чтобы кликнув на любой он исчезал.(удалялся)..

Я думаю, ошибка в том что я использовал UILoader.. поэтому и выдает ошибку..


Код:

package main{
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        //import flash.ui.Mouse;
        import fl.containers.UILoader;
        import flash.display.DisplayObject;
        //import fl.controls.Button;

        dynamic public class Body extends Sprite {;
        public function Body() {
                var i:int;
                for (i = 1; i < 91; i++) {

                        var container:Sprite = new Sprite();
                        addChild(container);
                        var item:UILoader = new UILoader();
                       
                        item.autoLoad = false;
                        item.scaleContent = true;
                        item.width = 40;
                        item.height = 40;
                        item.source = "/item/"+i+".swf";
                        var xx:Number=Math.random()*800;
                        var yy:Number=Math.random()*600;
                        item.move(Math.round(xx),Math.round(yy));
                        //item.rotation=Math.round(Math.random()*360);
                        item.load();
                        container.addChild(item);
                        container.addEventListener(MouseEvent.CLICK, onClick);
                }
                function onClick(event:MouseEvent):void {
                        container.removeChild(DisplayObject(event.target));
                }
        }

}
}


etc 08.08.2007 10:04

Дн начала надо отказаться от dynamic. Потом вместо UILoader использовать обычный Loader. Из пакета fl.* лучше пока ничего не использовать.

Alexsas 08.08.2007 10:39

Код:

package main{
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.display.*;
        import flash.net.URLRequest;
       
        public class Body extends Sprite {

                public function Body() {
                        var i:int;
                        for (i=1; i < 91; i++) {

                                var container:Sprite=new Sprite  ;
                                addChild(container);
                                var item:Loader=new Loader  ;
                                item.width=40;
                                item.height=40;
                                var url:String = "/item/" + i + ".swf";
                                var urlReq:URLRequest = new URLRequest(url);
                                var xx:Number=Math.random() * 800;
                                var yy:Number=Math.random() * 600;
                                item.move(Math.round(xx),Math.round(yy));
                                //item.rotation=Math.round(Math.random()*360);
                                item.load(urlReq);
                                container.addChild(item);
                                container.addEventListener(MouseEvent.CLICK,onClick);
                        }
                        function onClick(event:MouseEvent):void {
                                container.removeChild(DisplayObject(event.target));
                        }
                }

        }
}

теперь выдает ошибку на move.. и правильно у Loader нет такого метода..

так как быть? как мне лоадеры раскидать?

etc 08.08.2007 10:45

У Loader есть свойства x и y.

Скобки при создании экземпляров ставить обязательно.

Alexsas 08.08.2007 10:52

Код:

package main{
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.display.*;
        import flash.net.URLRequest;

        public class Body extends Sprite {

                public function Body() {
                        var i:int;
                        for (i=1; i < 91; i++) {

                                var container:Sprite=new Sprite();
                                addChild(container);

                                var item:Loader=new Loader();
                                var url:String = "/item/" + i + ".swf";
                                var urlReq:URLRequest = new URLRequest(url);
                                item.load(urlReq);
                               
                                var xx:Number=Math.random() * 800;
                                var yy:Number=Math.random() * 600;
                                item.x=Math.round(xx);
                                item.y=Math.round(yy);
                                item.width=40;
                                item.height=40;
                               
                                container.addChild(item);
                                container.addEventListener(MouseEvent.CLICK,onClick);
                        }
                        function onClick(event:MouseEvent):void {
                                container.removeChild(DisplayObject(event.target));
                        }
                }

        }
}

этот код не выдает ошибок, но и объектов не показывает...
в чем проруха?

Alexsas 08.08.2007 12:04

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

etc 08.08.2007 12:45

Я не могу торчать на форуме целый день. Мне ещё и на работу и с работы ездить надо, помимо того, что нужно работать.

Ширину и высоту пустому клипу бессмысленно выставлять. По этой причине может и не показывать ничего.

Alexsas 08.08.2007 12:56

да ___etc я все понимаю..
спасибо уже и так гиганское..
постараюсь реже задавать вопросы.. и больше поделу..


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

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