Просмотр полной версии : Код отключает прорисовку
Всем привет.
У меня такая беда: создаю в игре бекграунд программно. Использую метод http://xitri.com/2009/06/24/dynamic-background-for-flash-game.html (генерируется штук 300-400 мувиков, распределяется по экрану, применяются фильтры, а когда готово - всё это перегоняется в битмапу и уже битмапа - добавляется одним мувиком. Все остальные - удаляются.)
Делаю это функцией bg. И когда идёт к ней обращение, вся флешка на пару секунд подвисает.
Выглядит это так: нажимает пользователь на кнопку "Играть", пару секунд ничего не происходит, а потом появляется уровень: с графикой, музыкой и собственно уже игрой. Курсор, при этом, остаётся в виде руки (наведение на кнопку), т.е. всё конкретно подвисает.
Хотя, если идти по логике выполнения, там успевает удалиться экран с меню, и добавиться мувик с игрой, в который, собственно, в это время генерируется и бекграунд, который всё и подвешивает.
Вопрос, собственно, заключается в следующем: как можно убрать эту бешеную нагрузку на флеш и сделать чтоб после нажания появлялась иконка загрузки (крутилась), а в это время - генерировался бы бекграунд?
Я так понимаю, нужно каким-то образом распределить ресурсы между обработкой кода и графики во флешке?
Хотя, если идти по логике выполнения, там успевает удалиться экран с меню
Удалится то он успевает, но изменения на экране появятся только после обновления экрана, которое, произойдёт после выполнения всего кода.
Да, нужно разбивать загружаемые данные на порций и между загрузками, давать флеш плееру отрисовывать промежуточные кадры.
Удалится то он успевает, но изменения на экране появятся только после обновления экрана, которое, произойдёт после выполнения всего кода.
Да, нужно разбивать загружаемые данные на порций и между загрузками, давать флеш плееру отрисовывать промежуточные кадры.
Как это делается? Пример кода или ссылки на записи или статьи дайте, пожалуйста.
Для начала, замерьте, какие участки загрузки - самые толстые. Измерить можно с помощью getTimer():
var time:Number = getTimer();
// Big loading resources 1
trace('Loading 1, duration:', getTimer() - time);
time = getTimer();
// Big loading resources 2
trace('Loading 2, duration:', getTimer() - time);
time = getTimer();
// ...
Таким образом, узнаете, какие участки необходимо разбить. Как именно разбить загрузку ваших ресурсов - виднее только вам. Но в любом случае, вам понадобиться подписаться на timer, или enterFrame.
Один из вариантов, это последовательный вызов функций, достаточно ламерский способ:
// Start loading
loadingPart1();
function loadingPart1():void{
// ...
setTimeout(loadingPart2, 1000)
}
function loadingPart2():void{
// ...
setTimeout(loadingPart3, 1000)
}
function loadingPart3():void{
// ...
setTimeout(startGame, 1000)
}
function startGame():void{
// Start Game!
}
Хорошим способом, будет подписать порций загрузки к enterFrame или лучше к таймеру. Определённым образом спроектировать игру. Это довольно сложно.
Tails, боюсь способ, описанный вами - не подойдёт - я ничего не загружаю (или я чего-то не понял).
Вот функция:
private function createTextures(m:MovieClip):void
{
var bm:MovieClip;
// заполняем первый этаж "мусором"
for (var i:int = 1; i < 300; i++)
{
bm = new bgSpot01;
place(bm,"bg");
m.addChild(bm);
bm = new bgSpot02;
place(bm,"bg");
m.addChild(bm);
}
var v:int;
for (i = 1; i < 800; i++)
{
v = 1+Math.random()*4;
if(v==1)
{
bm = new bgStone01;
}
if(v==2)
{
bm = new bgStone02;
}
if(v==3)
{
bm = new bgStone03;
}
if(v==4)
{
bm = new bgStone04;
}
place(bm,"stone");
m.addChild(bm);
}
for (i = 1; i < 50; i++)
{
v = 1+Math.random()*3;
if(v==1)
{
bm = new bgGrass01;
}
if(v==2)
{
bm = new bgGrass02;
}
place(bm,"grass");
m.addChild(bm);
}
var bmpd:BitmapData = new BitmapData(Gbv.SCR_W,Gbv.SCR_H,true,0);
bmpd.fillRect(bmpd.rect,0);
bmpd.draw(m,new Matrix(1,0,0,1,m.x,m.y));
var bmm:Bitmap = new Bitmap(bmpd);
while (m.numChildren)
{
m.removeChildAt(0);
}
m.addChild(bmm);
}
Функция place с каждым мувиком - это ещё дополнительные команды: растягивание мувика, прозрачность, расположение.
Т.е. просто одновременно на экран добавляется где-то около 2000 мувиков, которые ещё к тому же и нарисованы в векторе. Это ресурсоёмко. Это и хочу как-то разбить, распределить нагрузку так, чтоб можно было в это время, хотя бы, крутить колёсико "загрузки".
Словом "загрузка" я обозначил ресурсоёмкий и длительный по выполнению участок кода.
Перечитайте способ ещё раз, там ответ на ваш вопрос.
Ещё для ознакомления, можете почитать Мука, тему про запланированные обновления экрана. В этой (http://www.books.ru/books/actionscript-30-dlya-flash-podrobnoe-rukovodstvo-618282/) книжке
стр. 653
Словом "загрузка" я обозначил ресурсоёмкий и длительный по выполнению участок кода.
Перечитайте способ ещё раз, там ответ на ваш вопрос.
Ещё для ознакомления, можете почитать Мука, тему про запланированные обновления экрана. В этой (http://www.books.ru/books/actionscript-30-dlya-flash-podrobnoe-rukovodstvo-618282/) книжке
стр. 653
Да, сделал, благодарю, тему можно закрывать.
Очень красиво получилось на мой взгляд :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.