Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Stage и preloader (http://www.flasher.ru/forum/showthread.php?t=206343)

Всеволод 29.01.2014 05:48

Stage и preloader
 
Я начинающий, не судите строго.
Есть игра. При нажатии кнопки в главном меню запускается сам игровой процесс. Нужно было осуществить управление клавиатурой. Единственным рабочим способом оказался такой:
Код AS3:

/*Обработчик нажатие кнопки начала игры*/
function gsConnect(event:Event){
addChild(_game);}
/*конструктор класса _game*/
function Game() {
. . . .
this.addEventListener(Event.ADDED, _test);
. . . .
}
/*Ф-я добавление слушателей клавиатуры*/
function _test(event:Event){
stage.addEventListener(KeyboardEvent.KEY_DOWN, reportKeyDown);
stage.addEventListener(KeyboardEvent.KEY_UP, reportKeyUp);
stage.addEventListener(Event.ENTER_FRAME,Movement);}

Я, честно говоря, довольствовался бы и подобным костылём. НО решил я, значит, добавить прелоадер, который ничем особенным не отличается.
[spoiler]
Код AS3:

package  {
        import flash.display.*;
        import flash.events.*;
        import flash.text.TextField;
        import flash.net.URLRequest;
 
        public class Preloader extends Sprite {
                var progress_tf:TextField = new TextField();
                var loader:Loader = new Loader();
 
                public function Preloader() {
                        var loader_url='http://.... .swf';
 
                progress_tf.x=530/2;
                progress_tf.y=380/2;
                addChild(progress_tf);
 
                var loadURL:URLRequest=new URLRequest(loader_url);
 
                loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS,onLoadProgress);// прогресс загрузки
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onLoadComplete);// загружено
                loader.load(loadURL);
                }
                function onLoadProgress(evt:ProgressEvent):void {
            progress_tf.text = String(Math.round(100*(evt.bytesLoaded/evt.bytesTotal)))+"%";
                }
                function onLoadComplete(evt:Event):void {
            removeChild(progress_tf);
            addChild(loader);
        }
 
        }
 
}

[/spoiler]
И что вы думаете, естественно, stage теперь не фокусируется на классе Game(имхо), и не реагирует на нажатие клавиш. Не прошу решить проблему за меня. Хотел бы услышать объяснение почему таковая возникает, либо почувствовать пинок в максимально конкретезированном направлении её решения.

Dukobpa3 29.01.2014 06:34

Должно работать, но как вариант:
Код AS3:

this.addEventListener(Event.ADDED, _test);

Event.ADDED -> Event.ADDED_TO_STAGE

Ну и вцелом не оч красивый прелоадер получился. Лучше посмотреть на шаблон, который по-умолчанию создает FleshDevelop.

Всеволод 29.01.2014 07:07

Dukobpa3, примного благодарю за отклик.
Цитата:

Ну и вцелом не оч красивый прелоадер получился.
Прелоадер пока только для тестирования, рисоваться будет отдельно позже.(Просто "тестеры" уже достали вопросом "а чё это у меня белый экран?").

Касательно сути вопроса вот в чем оказалась загвоздка. Я работаю в честно спизженном купленном Adobe Flash CS6. Не знаю как в FD, но в adobe в параметрах публикации есть такой пункт как "безопасность при локальном воспроизведении". Тестировал я прелоадер через вк(всеми я, так понимаю, "любимый"), и это выдавало результат описанный в теме. И ТУТ Я РЕШИЛ(ВНЕЗАПНО) поменять параметр публикации на "Только по сети", и естественно всё пошло по накатанной. Остался вопрос почему, хоть и от части, но оно работало до этого, и почему именно так.

Добавлено через 1 час 19 минут
Ошибка, как выяснилось, заключалась и продолжает заключаться в том, что на созданный экземпляр класса Game не переходит фокус, т.е. пока те тыкнешь по сцене мышкой — никакой реакции на клавиши. Пробовал
Код AS3:

stage.focus = this;

, при локальном тестировании работает и без, а Вконтакте всё также.

Добавлено через 2 часа 26 минут
Тему можно закрывать
Решение оказалось в итоге в дважды проще чем думалось. Фокус теряло само приложение. Всё прекрасно работает, если строчку
Код AS3:

stage.focus = this;

изменить на
Код AS3:

stage.focus = stage;


myakushka 29.01.2014 12:57

Интересно почему приложение теряло фокус...

in4core 29.01.2014 14:44

Цитата:

Интересно почему приложение теряло фокус...
Это Магия!


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

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