![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Здравствуйте товарищи! Давненько я сдесь не задавал вопросов, но вот теперь настал час, когда я немогу обойтись без вашей помощи. Решил перейти на классы, чтобы в слудующем несколько упростить усвоение AS3 но пока не оставаться без денег, и что-то делать. Так сказать решил пойти по двум тропам одновременно. Началось все более менее неплохо, написал свой первый в жизни класс, простенький, но всеравно было приятно, от того, что закончился первый эксперимент успешно. Это был обычный классик, который программно рисует квадраты
Потом я написал второй классик, который программно рисует рамки. Далее я решил написать третий классик, но тут успех обошел меня стороной. Вот собственно решил попрасить вашей помощи. В свое время именно тут мне помогли осовить AS2 за, что я всем очень благодарен. Собственно перейду к вопросу.Третий класс, который у меня не получился, это так сказать, мини-прелоадер. com/flashgangsta/Preloader.as 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) + "%"); } } } stop(); function MyFunc():Void { trace("lisa"); } this.onEnterFrame = function() { Preloader.loading(this, MyFunc); } ![]() Помогите пожалуйста, подскажите в чем я ошибся. Благодарю за внимание.
__________________
Убейте меня! |
|
|||||
|
Черт возьми )) действительно все работает
![]() Както не привычно просто что пока ненажмешь 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) + "%");
}
}
}
}
__________________
Убейте меня! Последний раз редактировалось джонатан; 26.04.2009 в 03:16. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Я бы посоветовал использовать интервал - с onEnterFrame клипа, в который грузишь, могут происходить разные чудеса)))
И назови методы нормально, что еще за лоадинг))) viewLoading, displayLoading, controlLoading, convoyLoading, escortLoading))))) И не func, а completeHandler - у тебя же почти событие тут происходит))) Мирового массштаба)) Удачи тебе, отличное начинание))
__________________
Reality.getBounds(this); |
|
|||||
|
Негуру
администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
|
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 с классом. |
|
|||||
|
private:Видемый только в классе;
public: Метод доступен любому классу; (лучше, использовать get and set для переменых); static: Доступен непосредственно из класса, а не из экземпляра класса пример:Math.round(); package: Пакеты являются важной частью работы с классами, потомучто они позволяют предотвратить конфликты имен классов. Примерно как, в одну папку, не засунешь две разные фото с одним названием. dynamic:Определяет, что образцы класса могут обладать динамическими свойствами, добавленными во времени выполнения. Если Вы используете динамический атрибут на классе, Вы можете добавить свойства к образцам того класса во времени выполнения. Классы, которые не отмечены как динамические, считают запечатанными, что означает, что свойства не могут быть добавлены к образцам класса. А лучше, читай хелп; В АС3 есть хорошие ссылки на pdf. файлы.
__________________
Книги и желание лучшие учителя. Последний раз редактировалось Vektor; 26.04.2009 в 04:23. |
|
|||||
|
Всем огромное спасибо!
Вот еще один вопросик у меня. Значит так. Добавил я в свой класс переменную «loaded», и непонятно она как-то отображается совсем. Взгляните плиз: 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); } } } Если же я обявлю переменную без static То trace() и вовсе выводит undefined ![]() Всем огромное спасибо за внимание.
__________________
Убейте меня! Последний раз редактировалось джонатан; 26.04.2009 в 15:46. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
А куда ты static дел?))))
Добавлено через 5 минут Сам подумай, если это у тебя написано в теле обработчика события onEnterFrame клипа target, то чье свойство ты выводишь? Добавлено через 12 минут Вообще, плохая практика из своего класса нагружать внешние объекты новыми свойствами и тем более методами, а уж тем более - переписывать их родные (как onEnterFrame в данном случае). Это чревато такими багами, которые замучаешься потом искать, да и просто нарушает "этику" класса. Надо постараться сделать класс независимым везде где это возможно. В данном случае тебе нужен просто таймер для периодического опроса, и трогать для этого таргет-клип не надо. Надо завести интервал и опрашивать по нему. Никогда не лезь во внутреннее устройство чужих экземпляров без насущной необходимости.
__________________
Reality.getBounds(this); |
|
|||||
|
Статик я убрал чтобы не писать из фла весь путь к классу, а создать экземпляр класса.
import com.flashgangsta.*;
var preloader:Preloader = new Preloader();
function StartProgramm():Void {
trace("Ы");
}
stop();
preloader.listenLoading(this, StartProgramm);
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 По последнему добавлению, ьольшой сенкс. Нарушать «этику» не хочу, сейчас же перепишу ![]() Переписал: 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); } }
__________________
Убейте меня! Последний раз редактировалось джонатан; 26.04.2009 в 22:37. |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
К пятому варианту пора бы определиться, будет у тебя статик или будет экземпляр))) А то уже вообще трудно сообразить, что тут за арабская вязь))) Зачем тебе эти хитрые методы сетЛоадКомплит и гетЛоадКомплит? Да к тому же паблик - ты собираешься снаружи командовать, что клип загрузился?))))
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);
}
}
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 26.04.2009 в 22:54. |
![]() |
![]() |
Часовой пояс GMT +4, время: 23:59. |
|
|
« Предыдущая тема | Следующая тема » |
|
|