PDA

Просмотр полной версии : AS3 - начало.


Alexsas
06.08.2007, 13:15
Добрый всем день.
Сильно уж очень хочу 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
вот оно

etc
06.08.2007, 13:59
Собственно, вот. Вопросы по реализации — велкам.

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 я все понимаю..
спасибо уже и так гиганское..
постараюсь реже задавать вопросы.. и больше поделу..