Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   preloader подскажите, почему не работает (http://www.flasher.ru/forum/showthread.php?t=144857)

DenverZ 22.09.2010 19:47

preloader подскажите, почему не работает
 
Вложений: 1
Здравствуйте,
прикрепляю исходник прелоадера и картинки для загрузки

если код пишу непоследственно по флеш ролике, то все работает
но через класс не пашет

подскажите, что не так?

Вложение 25189

AlesNormales 22.09.2010 20:23

Исходник открыть не могу, озвучьте ошибку.

DenverZ 22.09.2010 20:27

суть в следующем
есть три слоя
первый (самый нижний) это картинка, на втором кадре
второй слой (по середине) это прелоадер (символ) в первом кадре, который связан с классом Preloader
третий слой, это actionscript в первом кадре, который просто останавливает клик stop();

вот класс Preloader.as

Код AS3:

package classes
{
        import flash.display.MovieClip;
        import flash.events.*;
 
        public class Preloader extends MovieClip
        {               
                public function Preloader()
                {
                        addEventListener(Event.ENTER_FRAME, enterFrameListener);
                }
 
                private function enterFrameListener(e:Event):void
                {
                        var bytesLoaded:Number = stage.loaderInfo.bytesLoaded;
                        var bytesTotal:Number = stage.loaderInfo.bytesTotal;
                        var total:Number = bytesLoaded / bytesTotal;
 
                        if (bytesLoaded == bytesTotal || bytesTotal == 0)
                        {
                                removeEventListener(Event.ENTER_FRAME, enterFrameListener);
                                gotoAndStop(2);
                        }
 
                        else
                        {
                                preloaderFill_mc.scaleX = total;
                        }
                }
        }
}

после запуска ничего не происходит, прелоадер (полоска) стоит на месте
если делаю с имитацией загрузки, полоска заполняется, но потом начинает мерцать, то прелоадер (полоска), то картинка контента
и пишет ошибку

Код:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at classes::Preloader/enterFrameListener()


i.o. 22.09.2010 20:29

ну вам же все уже написали:
Цитата:

Не удается вызвать свойство или метод со ссылкой на объект "null".
ищите что у вас null, трейсите или еще как.

DenverZ 22.09.2010 20:32

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

null это addEventListener ругается

если сможете помочь решить проблему, буду благодарен
если нет, то плиз не стоит флудить

i.o. 22.09.2010 20:33

а я вам и помогаю - трейсите объекты, только так вы сможете найти где у вас там null

DenverZ 22.09.2010 20:35

да я оттрейсил уже все что можно, не понимаю что сделать нужно
я только учусь

я же специально прикрепил код, запустите, гляньте, сразу станет все ясно...
если действительно помочь хотите ;-)

i.o. 22.09.2010 20:37

подозреваю, что stage вы не трэйсили
или вот это еще вызывает сомнения preloaderFill_mc

DenverZ 22.09.2010 20:38

трейсил ([object Stage])

я не понимаю, неужели так трудно запустить код, и посмотреть? зачем толочь воду в ступе, если можно посмотреть все... для этого и прикрепил код

Добавлено через 32 секунды
preloaderFill_mc это инстанс имя символа

i.o. 22.09.2010 20:43

мне - да, трудно. Подождите немного, сейчас еще кто-нибудь подключится )

DenverZ 22.09.2010 20:46

ну тогда не стоит ввязываться в дискуссию, если решили просто пофлудить, мое имхо

leofit 22.09.2010 20:54

Вы бы не CS5 тогда выкладывали, что ли.. В CS4 воспроизвел все что смог, ошибки нет

DenverZ 22.09.2010 20:59

четвертой версии увы нет... разве дело в версиях флеша?

у Вас при запуске полноценно наполняется индикатор загрузки и потом выдается изображение???

leofit 22.09.2010 21:01

У меня 4 версия, и поэтому я, и многие не другие не могут открыть исходник fla файла, по коду ошибок не выдает, но это с моей библиотекой, переконвертируйте и выложите (File/save as/Flash CS4)

КорДум 22.09.2010 21:01

В настройках "сохранить как" есть версия флеша.

DenverZ 22.09.2010 21:02

момент

AlesNormales 22.09.2010 21:03

Я сделал исходник в точности такой как описано в вашем посте. Но есть одна проблема-он работает).
Слои от нижнего к верхнему:
1. Картинка во втором ключевом кадре
2. Мувиклип прелоадера унаследованный от класса Preloader(состоит из прямоугльника и лежащей на нем полоски-мувиклипа preloaderFill_mc) в первом ключевом кадре
3.stop() в первом ключевом кадре

Если надо могу выложить.

DenverZ 22.09.2010 21:06

Вложений: 1
вот исходник для версии CS4

Вложение 25192

DenverZ 22.09.2010 21:07

AlesNormales если не трудно выложите Ваш исходник и гляньте мой, который я прикремил для CS4 :)

leofit 22.09.2010 21:09

У меня из за Вас флеш повис! Не забыли ли Вы поставить stop во втором кадре?

AlesNormales 22.09.2010 21:11

У вас нету stop() в первом кадре
и вместо gotoAndStop(2) надо (parent as MovieClip).gotoAndStop(2). потому что вы не по линейке прелоадера хотите шагать а по главной линеке.

DenverZ 22.09.2010 21:18

AlesNormales спасибо огромное
насчет stop() не поставил это уже во время проб своих, в оригинале там стояло
все дело как раз было в parent as MovieClip

сейчас все работает, но при это выдается предупреждение

Код:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at classes::Preloader/enterFrameListener()[F:\программирование\flash\Asteroid\classes\Preloader.as:15]

вот код

Код AS3:

package classes
{
        import flash.display.MovieClip;
        import flash.events.*;
 
        public class Preloader extends MovieClip
        {               
                public function Preloader()
                {
                        addEventListener(Event.ENTER_FRAME, enterFrameListener);
                }
 
                private function enterFrameListener(e:Event):void
                {
                        var bytesLoaded:Number = stage.loaderInfo.bytesLoaded;
                        var bytesTotal:Number = stage.loaderInfo.bytesTotal;
                        var total:Number = bytesLoaded / bytesTotal;
 
                        if (bytesLoaded == bytesTotal || bytesTotal == 0)
                        {
                                removeEventListener(Event.ENTER_FRAME, enterFrameListener);
                                (parent as MovieClip).gotoAndStop(2);
                        }
 
                        else
                        {
                                preloaderFill_mc.scaleX = total;
                        }
                }
        }
}

вроде удаляю слушатель как надо?

leofit 22.09.2010 21:19

Сделайте как Вам советуют +:
1. добавьте неключевой кадр на слой прелодера во фрейм2
2. Добавьте ключевой кадр в акшенс на фрейм2 и там пропишите stop();
И удалите там уже прелоадер

DenverZ 22.09.2010 21:19

Забыл добавить, что эта ошибка возникает, во время "имитации загрузки", если просто запустить, то сразу выдается картинка (второй кадр), оно и понятно, т.к. грузится с машины

AlesNormales 22.09.2010 21:20

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

AlesNormales 22.09.2010 21:22

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

DenverZ 22.09.2010 21:23

как Вы считаете, правильнее использовать прелоадер на кадрах + внешний класс самого прелоадера (как в моем варианте)

или же, использовать прелоадер в чистых классах?
т.е. саму сцену привязать к главному классу например Main
в нем вызывать класс Preloader в котором вызывать классы мувиклипов, т.е. добавлять на сцену в ручную и уже после загрузки контента вызывать класс например Game Т.е. непосредственно главный класс игры (управляющий класс) ?

если можно, расскажите все за и против таких методов

Добавлено через 1 минуту
вот в том примере что Вы прикрепили, так же вылезает ошибка

Код:

TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
        at classes::Preloader/enterFrameListener()[C:\Users\Денис\Downloads\AsteroidCS4\AsteroidCS4\classes\Preloader.as:15]

именно при "имитации загрузки"
без нее все четко, без ошибок

Добавлено через 4 минуты
leofit спасибо, помогло

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

что скажете уважаемые?

AlesNormales 22.09.2010 21:33

Мистика. 5 раз проверил-нету такой ошибки. все корректно работает. в AS3 кадров я боюсь, именно потому что при переходе по линейке вылазят ошибки на подобие вашей. Если есть возможность контролировать процесс без gotoAndStop()/goToAndplay(), не пользоваться кадрами, то нужно этой возможностью пользоваться. И код понятнее, и глюков меньше. А любой мувиклип можно поместить на сцену из библиотеки и в рантайме.

Psycho Tiger 22.09.2010 21:50

А почему нельзя поставить галочку Permit Debugging в Publish Settings и узнать, в какой же строчке кода происходит ошибка?

AlesNormales 22.09.2010 21:53

Можно поставить, но это если ошибка есть. а если ее нет то как узнать как ее вызвать?

Добавлено через 2 минуты
К тому же насколько я понимаю если я открываю чужой *.fla то и паблиш сеттинз полностью находятся в нем? А это значит что ошибка должна проявиться и у меня и в оригинале.

DenverZ 22.09.2010 21:57

спасибо всем за помощь, кто помогал ;-)
решил не пользоваться кадрами совсем... буду работать на чистом AC3

vic551 22.10.2010 13:31

Сегодня часа два проковырялся с такой же проблемой, причём на другой машине всё работало отлично.
Глюк именно при имитации загрузки клипа во флэш. Такое впечатление, что почему-то не отрабатывает в загрузчике removeEventListener.

Решил вот так:
Код AS3:

while(hasEventListener(Event.ENTER_FRAME))
  removeEventListener(Event.ENTER_FRAME, Слушатель);

Может не совсем правильно, но вроде работает...

Psycho Tiger 22.10.2010 13:56

О_О!!!
Достаточно просто
Код AS3:

removeEventListener(Event.ENTER_FRAME, Слушатель);


cleptoman 22.10.2010 14:59

Тигра, ну если несколько слушателей и мы хотим отписаться от всех, то примерно так и будет
Код AS3:

function _onEnterFrame(e:Event){
        trace("1");
}
function _onEnterFrame2(e:Event){
        trace("2");
}
this.addEventListener(Event.ENTER_FRAME,_onEnterFrame);
this.addEventListener(Event.ENTER_FRAME,_onEnterFrame2);
 
//запустили - в аутпут падают и 1 и 2
//идем далее:
 
trace(hasEventListener(Event.ENTER_FRAME));// true, дописываем дальше:
this.removeEventListener(Event.ENTER_FRAME,_onEnterFrame);
trace(hasEventListener(Event.ENTER_FRAME));// true, пересатили падать 1 в аутпут, дописываем дальше:
this.removeEventListener(Event.ENTER_FRAME,_onEnterFrame2);
trace(hasEventListener(Event.ENTER_FRAME));//false;

для отписки от всех слушателей люди(ленивые, как я) придумали самописные диструкторы

Psycho Tiger 22.10.2010 15:21

Ну вообще-то этот скрипт
Код AS3:

while(hasEventListener(Event.ENTER_FRAME))
removeEventListener(Event.ENTER_FRAME, Слушатель);

убъет фп в случае если 2 метода-обработчика.

cleptoman 22.10.2010 15:31

ну если слушатель в цикле не будет меняться, то да )

Psycho Tiger 22.10.2010 15:37

Ну вообще-то сомнительно перед глобальной отпиской проверять, есть ли такой слушатель.
Код AS3:

                        var i:int = 20000;
                        var time:Number = getTimer();
                        while (i--){
                                super.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                                if (super.hasEventListener(Event.ENTER_FRAME)) super.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
                        }
                        trace(getTimer() - time); //~23

Код AS3:

                        var i:int = 20000;
                        var time:Number = getTimer();
                        while (i--){
                                super.addEventListener(Event.ENTER_FRAME, onEnterFrame);
                                super.removeEventListener(Event.ENTER_FRAME, onEnterFrame);
                        }
                        trace(getTimer() - time); //~17


gloomyBrain 22.10.2010 15:49

Цитата:

Ну вообще-то сомнительно перед глобальной отпиской проверять, есть ли такой слушатель.
вообще нет причин что-либо проверять - removeEventListener удалит слушатель (если он есть) и не выкинет никакой ошибки (если его нет)

Psycho Tiger 22.10.2010 15:55

Цитата:

Сообщение от gloomyBrain (Сообщение 944600)
вообще нет причин что-либо проверять - removeEventListener удалит слушатель (если он есть) и не выкинет никакой ошибки (если его нет)

Единственная возможная причина была - стероид для скорости. Например, если нет слушателей для события, перед которым делается диспатч - то проверка на этот слушатель даст прирост в скорости почти в 15 раз. Из этих соображений можно было бы предположить, что отписка от несуществующего события тоже вещь затратная, однако моя проверка развеяла этот миф )

gloomyBrain 22.10.2010 16:30

Цитата:

стероид для скорости
Откуда? =)
Если проверка выполняется нативно, то как НЕ нативная проверка может быть быстрее?


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

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