Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Перехожу на классы. Помогите разобраться. (http://www.flasher.ru/forum/showthread.php?t=124296)

джонатан 26.04.2009 02:15

Перехожу на классы. Помогите разобраться.
 
Здравствуйте товарищи! Давненько я сдесь не задавал вопросов, но вот теперь настал час, когда я немогу обойтись без вашей помощи. Решил перейти на классы, чтобы в слудующем несколько упростить усвоение AS3 но пока не оставаться без денег, и что-то делать. Так сказать решил пойти по двум тропам одновременно. Началось все более менее неплохо, написал свой первый в жизни класс, простенький, но всеравно было приятно, от того, что закончился первый эксперимент успешно. Это был обычный классик, который программно рисует квадраты :) Потом я написал второй классик, который программно рисует рамки. Далее я решил написать третий классик, но тут успех обошел меня стороной. Вот собственно решил попрасить вашей помощи. В свое время именно тут мне помогли осовить AS2 за, что я всем очень благодарен. Собственно перейду к вопросу.
Третий класс, который у меня не получился, это так сказать, мини-прелоадер.


com/flashgangsta/Preloader.as
Код AS1/AS2:

class com.flashgangsta.Preloader {
        public static function loading(mc:MovieClip, func:Function):Void {
                trace("banan");
                if(mc.getBytesLoaded() == mc.getBytesTotal()) {
                        delete mc.onEnterFrame;
                        func();
                } else {
                        trace("loaded: " + (mc.getBytesLoaded() / mc.getBytesTotal() * 100) + "%");
                }
        }
}

index.fla

Код AS1/AS2:

stop();
 
function MyFunc():Void {
        trace("lisa");
}
 
this.onEnterFrame = function() {
        Preloader.loading(this, MyFunc);
}

Думаю объяснять тут ненужно, чего я хотел добиться. Единственное, что скажу, так это-то, что — неработает :(

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

iNils 26.04.2009 02:22

А что не работает то?

джонатан 26.04.2009 03:09

Черт возьми )) действительно все работает :D

Както не привычно просто что пока ненажмешь ctrl+s компилится старый сейв класса. Ну да ладно, с этим проехали, я тупица ) Чтобы тема не пропадала даром, расскажите мне пожалуйста что есть

private
public
static
dynamic
а также package

Если не трудно конечно. Спасибо :)

И еще! Чуть не забыл. Возможно ли мне непосредственно в самом классе, вставить onEnterFrame? Ну типа вот так:

Код:

class com.flashgangsta.Preloader {
        public static function loading(mc:MovieClip, func:Function):Void {
                mc.onEnterFrame = function() {
                        if(mc.getBytesLoaded() == mc.getBytesTotal()) {
                                delete mc.onEnterFrame;
                                func();
                        } else {
                                trace("loaded: " + (mc.getBytesLoaded() / mc.getBytesTotal() * 100) + "%");
                        }
                }
        }
}

Чтобы в fla просто вызваьб метод loading класса Preloader:
Код AS1/AS2:

Preloader.loading(this, MyFunc);


Wolsh 26.04.2009 03:53

Я бы посоветовал использовать интервал - с onEnterFrame клипа, в который грузишь, могут происходить разные чудеса)))
И назови методы нормально, что еще за лоадинг))) viewLoading, displayLoading, controlLoading, convoyLoading, escortLoading))))) И не func, а completeHandler - у тебя же почти событие тут происходит))) Мирового массштаба)) Удачи тебе, отличное начинание))

iNils 26.04.2009 04:07

1. private/public - ключевое слово метода, свойства или класса, определяют уровень доступа. public - доступен для любого вызывающего объекта. private только внутри класса или подкласса, то есть, если вы задали свойству private, то любой другой класс не наследуемый от данного, не получит доступа к свойству.
Коли вы собираетесь переходить на AS3, то скажу, что там подобных ключевых слов больше - internal/private/public/protected, но private здесь не дает доступа из подклассов, аналог для private из AS2 это protected. Про остальные прочитайте в хелпе, ссылка в моей подписи есть.

2. static - говорит о том, что свойство или метод принадлежит классу, а не экземплярам класса. Поэтому обращение идет через имя класса. Пример класс Math, у него все методы и свойства static. Методы и свойства класса не наследуются.

3. dynamic - ключевое слово класса, говорит о том, что свойства могут быть не описаны и добавляться в процессе выполнения. В противном случаи, они должны быть описаны с помощью var.

4. package - пакет. Служит для разделения классов на группу и помогает устранить конфликты между классами с одинаковыми названиями. Пример: вы создали флешку с классом Main, которая грузит в себя чужую флешку. Но так получилось, что в ней тоже есть класс с таким же именем. Возникает конфликт. Использую пакет, вы этого избегаете. А как избежать создания пакетов с одинаковым именем? Принято называть пакет по имени вашего домена. У меня пакеты начинаются с ru.inils, а потом указываю имя проекта или направления. Например ru.inils.utils, ru.inils.homepage.utils или ru.inils.ims.utils. Но самого имени пакете мало, должна быть соответствующая файловая структура. То есть, каждой слово пакета, это название каталога. В случае с com.flashgangsta.Preloader должен быть каталог com, в нем каталог flashgangsta, а в нем файл Preloader.as с классом.

Vektor 26.04.2009 04:19

private:Видемый только в классе;
public: Метод доступен любому классу; (лучше, использовать get and set для переменых);
static: Доступен непосредственно из класса, а не из экземпляра класса
пример:Math.round();
package: Пакеты являются важной частью работы с классами, потомучто они позволяют предотвратить конфликты имен классов.
Примерно как, в одну папку, не засунешь две разные фото с одним названием.
dynamic:Определяет, что образцы класса могут обладать динамическими свойствами, добавленными во времени выполнения. Если Вы используете динамический атрибут на классе, Вы можете добавить свойства к образцам того класса во времени выполнения. Классы, которые не отмечены как динамические, считают запечатанными, что означает, что свойства не могут быть добавлены к образцам класса.
А лучше, читай хелп;
В АС3 есть хорошие ссылки на pdf. файлы.

джонатан 26.04.2009 15:42

Всем огромное спасибо!
Вот еще один вопросик у меня. Значит так. Добавил я в свой класс переменную «loaded», и непонятно она как-то отображается совсем. Взгляните плиз:

Код AS1/AS2:

class com.flashgangsta.Preloader {
        public static var loaded:Boolean = false;
        public function listenLoading(target:MovieClip, completeHandler:Function):Void {
                target.onEnterFrame = function() {
                        if(target.getBytesLoaded() == target.getBytesTotal()) {
                                delete target.onEnterFrame;
                                completeHandler();
                                loaded = true;
                                trace(target + " loading is complete");
                        } else {
                                trace("loaded: " + Math.round((target.getBytesLoaded() / target.getBytesTotal() * 100)) + "%");
                        }
                        trace(loaded);
                }
        }
}

Я сразу придую ей значение false и меняю на true только по завершению загрузки, но trace, при симуляции загрузки, выводит что загрузка идет, а переменная равна true; если я уберу строку loaded = true; из условия, тогда выводится false. Как так? Почему она становится тру, не смотря на то что условие не выполняется?
Если же я обявлю переменную без static
Код AS1/AS2:

public var loaded:Boolean = false;

То trace() и вовсе выводит undefined
:o

Всем огромное спасибо за внимание.

Wolsh 26.04.2009 15:49

А куда ты static дел?))))

Добавлено через 5 минут
Сам подумай, если это у тебя написано в теле обработчика события onEnterFrame клипа target, то чье свойство ты выводишь?

Добавлено через 12 минут
Вообще, плохая практика из своего класса нагружать внешние объекты новыми свойствами и тем более методами, а уж тем более - переписывать их родные (как onEnterFrame в данном случае). Это чревато такими багами, которые замучаешься потом искать, да и просто нарушает "этику" класса. Надо постараться сделать класс независимым везде где это возможно. В данном случае тебе нужен просто таймер для периодического опроса, и трогать для этого таргет-клип не надо. Надо завести интервал и опрашивать по нему. Никогда не лезь во внутреннее устройство чужих экземпляров без насущной необходимости.

джонатан 26.04.2009 18:13

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

Код:

import com.flashgangsta.*;

var preloader:Preloader = new Preloader();

function StartProgramm():Void {
        trace("Ы");
}

stop();
preloader.listenLoading(this, StartProgramm);

Понял. Сенкс. Я вот как решил беду:

Код AS1/AS2:

class com.flashgangsta.Preloader {
 
        public static var loaded:Boolean;
 
        public static function setLoadComplete(value:Boolean):Void {
                loaded = value;
        }
 
        public function getLoadComplete():Boolean {
                return loaded;
        }
 
        public function listenLoading(target:MovieClip, completeHandler:Function):Void {
                setLoadComplete(false);
                target.onEnterFrame = function() {
                        if(target.getBytesLoaded() == target.getBytesTotal()) {
                                setLoadComplete(true);
                                delete target.onEnterFrame;
                                completeHandler();
                                trace(target + " loading is complete");
                        } else trace(target + "loaded: " + Math.round((target.getBytesLoaded() / target.getBytesTotal() * 100)) + "%");
                }
        }
}

Интересно, правильное решение я предпринял? Может есть какие-то иные варианты?

Wolsh По последнему добавлению, ьольшой сенкс. Нарушать «этику» не хочу, сейчас же перепишу :)

Переписал:

Код AS1/AS2:

class com.flashgangsta.Preloader {
 
        public static var loaded:Boolean;
        public static var loadListener:Number;
        public static var listenInterval:Number = 250;
        public static var handler:Function;
        public static var trg:MovieClip;
 
        public static function setLoadComplete(value:Boolean):Void {
                loaded = value;
        }
 
        public function getLoadComplete():Boolean {
                return loaded;
        }
 
        public static function listenLoading():Void {
                setLoadComplete(false);
                if(trg.getBytesLoaded() == trg.getBytesTotal()) {
                        setLoadComplete(true);
                        clearInterval(loadListener);
                        handler();
                        trace(trg + " loading is complete");
                } else trace(trg + " loaded: " + Math.round((trg.getBytesLoaded() / trg.getBytesTotal() * 100)) + "%");
        }
 
        public function start(target:MovieClip, completeHandler:Function):Void {
                handler = completeHandler;
                trg = target;
                loadListener = setInterval(listenLoading, listenInterval);
        }
}


Wolsh 26.04.2009 22:49

К пятому варианту пора бы определиться, будет у тебя статик или будет экземпляр))) А то уже вообще трудно сообразить, что тут за арабская вязь))) Зачем тебе эти хитрые методы сетЛоадКомплит и гетЛоадКомплит? Да к тому же паблик - ты собираешься снаружи командовать, что клип загрузился?))))
Код:

class com.flashgangsta.Preloader {
 
    public static var loadComplete:Boolean = false;
    private static var _loadListener:Number;
    private static var _listenInterval:Number = 30;
 
    private static function listenLoading(target:MovieClip, completeHandler:Function):Void {
        loadComplete = target.getBytesLoaded() == target.getBytesTotal();
        if(loadComplete) {
            clearInterval(_loadListener);
            completeHandler();
            trace(target + " loading is complete");
        } else trace(target + "loaded: " + Math.round((target.getBytesLoaded() / target.getBytesTotal() * 100)) + "%");
    }
 
    public static function start(target:MovieClip, completeHandler:Function):Void {
        _loadListener = setInterval(listenLoading, _listenInterval, target, completeHandler);
    }
}

Код:

import com.flashgangsta.Preloader;
stop();
function StartProgramm():Void {
    trace(Preloader.loadComplete ? "Ыыы!" : "упс...");
}
Preloader.start(this, StartProgramm);



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

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