вторник, 14 августа 2012 г.

Class

Привет!

В прошлом уроке я упомянул классах, так что приступим.

Что такое класс?
Классом можно называть, например, ручку. Ручку можно включить, выключить, написать ей что-нибудь - это методы класса. Также, у ручки есть характеристики: цвет, длина, толщина стержня, производитель - это поля класса.

Ок. Зачем мне это?
С классами всегда лучше. Чтобы создавать много объектов с одинаковым поведением.
Например, возьмем нашу кнопку из прошлого урока.


Много кнопок.







И как же мне сделать это?





Для начала, нужно понять структуру класса. Для примера возьмем вот такой класс:


package
{
    import flash.display.MovieClip;
    
    public class Main extends MovieClip
    {
        private var count : uint;
        
        public function Main () : void
        {
            this.sayHi();
        }
        
        private function sayHi () : void
        {
            trace( "Hi!" );
        }
    }
}


Поехали.


package
{
...

После слова package пишем путь от .fla файла до файла с классом. Например:
  • MyAwesomeGame.fla
  • Main.as
  • objects
    • Box.as
    • Wall.as
В таком случае у Main.as после package ничего не нужно писать, а у Box.as и Wall.as после package пишем objects.
package objects
{
...
Если есть вложенные папки, то их нужно разделять точками.

import flash.display.MovieClip;
...
Здесь импортируем все, что нам необходимо в этом классе. Не стоит писать что-то типа:
import flash.*;
.* означает, что нужно импортировать все, что находится в пакете.

Пример в студию.
Например, классу Main вдруг понадобился класс Box ( из примера про package ). Тогда пишем:
import objects.Box;
...
На сколько я понимаю, если классы находятся в одном пакете, то импортировать не обязательно.

Это все?
public class Main extends MovieClip
{
...

Собственно, Main - имя класса, а вот на extends стоит остановиться поподробнее. extends означает, что мы хотим наследовать класс от классов, идущих после оператора extends.

Например:
public class A extends B
{
...

Это означает, что класс A унаследует поля и методы класса B, и с классом A можно работать точно так же, как и с классом B.

Долго еще?
private var count : uint;
...

Тут объявляются все переменные и константы класса. Ничего сложного.

Z-z-z-z....
public function Main () : void
{
...

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


private function sayHi () : void
{
...

Здесь находятся остальные методы класса.

Теперь переделаем наш кнопко-проект.

Неужели.
Первое, что нужно сделать - это написать класс кнопки. Для этого заходим в библиотеку (  Windows -> Library ), там выбираем нашу кнопку, жмем правой кнопкой мыши -> Properties. Заполняем.

О Боги. Что все это значит?
Name - Ничего не значит. Просто пишем что-нибудь вменяемое, чтобы потом можно было легко найти объект.
Type - Знаем что это, проходили.
Export for ActionScript - Дает нам власть над миром возможность создавать символ из кода.
Class - Класс символа. Если мы не написали свой класс, то Flash создаст свой, необходимый для создания экземпляра символа.
Остальное нам не важно. Теперь непосредственно кодинг.

EpicButton.as:
package
{
    import flash.display.MovieClip;
    import flash.events.MouseEvent;
    
    public class EpicButton extends MovieClip
    {
        
        public function EpicButton ( options : Object ) : void
        {
            this.init( options );
        }
        
        private function init ( options : Object ) : void
        {
            this.x = options.x;
            this.y = options.y;
            
            this.useHandCursor = true;
            this.buttonMode = true;
            
            this.mouseOutHandler();
            
            this.addEventListener( MouseEvent.MOUSE_OVER, mouseOverHandler );
            this.addEventListener( MouseEvent.MOUSE_DOWN, mouseDownHandler );
            this.addEventListener( MouseEvent.MOUSE_OUT, mouseOutHandler );
            this.addEventListener( MouseEvent.MOUSE_UP, mouseUpHandler );
            
            // Добавляем кнопку на сцену
            Main.stageLink.addChildAt( this, 0 );
        }
        
        private function mouseOutHandler ( e : MouseEvent = null ) : void
        {
            this.gotoAndStop( 1 );
        }
        
        private function mouseOverHandler ( e : MouseEvent = null ) : void
        {
            this.gotoAndStop( 2 );
        }
        
        private function mouseDownHandler ( e : MouseEvent = null ) : void
        {
            this.gotoAndStop( 3 );
        }
        
        private function mouseUpHandler ( e : MouseEvent = null ) : void
        {
            this.gotoAndStop( 4 );
        }
    }
}

Main.as:
Подключаем как главный класс, конечно.
package
{
    import flash.display.MovieClip;
    import flash.display.Stage;
    
    public class Main extends MovieClip
    {
        // Статичная ссылка на сцену
        // Статичная для того, чтобы можно было обратиться из любого места кода
        public static var stageLink : Stage;
        
        public function Main () : void
        {
            this.init();
        }
        
        private function init () : void
        {
            // Сохраняем ссылку на сцену
            Main.stageLink = stage;
            this.createEpicButtons();
        }
        
        private function createEpicButton ( x : Number, y : Number ) : void
        {
            var
            // Создаем объект с необходимыми параметрами
            options : Object = {
                x : x,
                y : y
            },
            // Создаем новый экземпляр кнопки
            // И передаем туда объект с параметрами
            epicButton = new EpicButton( options );
        }
        
        private function createEpicButtons () : void
        {
            this.createEpicButton( 86, 44 );
            this.createEpicButton( 440, 50 );
            this.createEpicButton( 225, 156 );
            this.createEpicButton( 423, 201 );
            this.createEpicButton( 148, 292 );
            this.createEpicButton( 366, 324 );
        }
    }
}


Все файлы должны быть в одной папке. Если не получилось - держите исходник. :)

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

Отправить комментарий