Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как сделать надежную паузу в игре? (http://www.flasher.ru/forum/showthread.php?t=145943)

OlegEF 24.10.2010 03:41

Как сделать надежную паузу в игре?
 
Есть fla файл
Код AS3:

init();
doSomething();
doSomethingElse();
end();

Нужно чтобы программа после выполнения:

Код AS3:

init();
doSomething();
//останавливалась и ждала секунду или несколько, а затем выполняла:
doSomethingElse();
//и наконец
end();




Если использовать эту конструкцию:
Код AS3:

function sleepingFun (event:TimerEvent):void
{
doSomethingElse();
}
 
 
var tact:Timer = new Timer(1000,1);
tact.addEventListener(TimerEvent.TIMER_COMPLETE, sleepingFun);
tact.start();

То end() выполняется раньше чем doSomethingElse();

Добавлять в sleepingFun end не имеет смысла, так как пауза может быть и вложенной и последовательно несколько пауз может быть.

Я уже с неделю над задачкой бьюсь. Помогите, плиз или подскажите, может я чего не понимаю?

Wolsh 24.10.2010 04:49

Ну наверно создать Очередь? Например массив методов. И в обработчике событий таймера вызывать их по очереди (по счетчику).

i.o. 24.10.2010 04:51

Цитата:

может я чего не понимаю?
Верно. Такое сделать нельзя. Используйте событийную модель, для подобных вещей. Выполнение кода остановить нельзя.

-De- 24.10.2010 12:27

Не использовать таймеры. Использовать только одно подписывание на ENTER_FRAME, которое у всего, чего надо вызывает когда надо update(dt), где dt - время между фреймами.
http://www.kongregate.com/forums/4/topics/1773

OlegEF 24.10.2010 13:14

Цитата:

Сообщение от i.o. (Сообщение 944962)
Используйте событийную модель

Пример кода можете привести?

Добавлено через 2 минуты
Цитата:

Сообщение от -De- (Сообщение 944983)
Не использовать таймеры. Использовать только одно подписывание на ENTER_FRAME, которое у всего, чего надо вызывает когда надо update(dt), где dt - время между фреймами.
http://www.kongregate.com/forums/4/topics/1773

Посмотрел, по английски не понимаю.
А что касается приведенного в статье кода, то он не полный.
Можете помочь понять о чем там речь идет?

alatar 24.10.2010 14:27

Цитата:

Можете помочь понять о чем там речь идет?
Ну так -De- уже описал о чем там речь.

-De- 24.10.2010 14:29

Я больше за организацию основного цикла работы в играх писал и паузы типа юзер вызвал меню %)
Код AS3:

init();
doSomething();
//останавливалась и ждала секунду или несколько, а затем выполняла:
doSomethingElse();
//и наконец
end();

Вот так не то чтобы совсем нельзя, но реализация этого поимеет столько гадких побочных эффектов, что оно того однозначно не стоит (ну например оно перерисовываться не будет при выполнении).
Надо понять, как вообще покадровая система флэша работает. Где-то было описание, но я сейчас не найду, потому своими словам (с неточностями, но основную идею передает):
идёт обработка всех событий (заход в кадр и обработка кода, типа того, что выше - тоже там), затем отрисовка, затем, если осталось время, можно поспать и потом цикл повторяется. Ну т.е. у вас там было написано

Код AS3:

init();
doSomething();
//код с таймером
end();

- так так оно и выполнилось, в одном кадре.
В статье речь о том, что можно сделать "класс" типа такого.
Код AS3:

package  
{
        import flash.events.Event;
        import flash.utils.getTimer;
 
        public class Update
        {
                private static var oldTime:Number = Number.NaN;
                private static var updateables:Array = new Array;
                private static var pauseLevel:int = 0;
 
                public static function update(ev:Event):void {
                        var nowTime:Number = getTimer();
                        if (isNaN(oldTime)) oldTime = nowTime;
                        var dt:Number = nowTime - oldTime;
                        oldTime = nowTime;
 
                        if (pauseLevel == 0) {
                                for each(var updateable:Object in updateables) {
                                        updateable.update(dt);
                                }
                        }
                }
                public static function pause():void {
                        ++pauseLevel;
                }
                public static function unpause():void {
                        --pauseLevel;
                }
                public static function add(updateable:Object):void {
                        //лучше написать интерфейс IUpdateable, в котором есть только одна функция public function update(dt:Number):void; и заменить все Object на IUpdateable
                        updateables.push(updateable);
                }
                public static function remove(updateable:Object):void {
                        for (var i:int = 0; i < updateables.length; ++i) {
 
                        }
                }
        }
}

Затем подписать его и только его на ENTER_FRAME - addEventListener(Event.ENTER_FRAME, Update.update); , всё, что как-то зависит от времени, паузится итп. имеет функцию update(dt:Number):void, в которой (и только в ней) собственно происходят какие-то действия, зависящие от времени. Пауза/пуск там написаны.
Писать в кадрах при таком подходе оч. тяжко, что только плюс =)

OlegEF 24.10.2010 14:58

Спасибо.
А пример использования такого класса можете привести?
Только не очень сложный.

Добавлено через 6 часов 22 минуты
Я только начинаю программировать на Action Script.
Без понятия как использовать этот класс.

Я сейчас делаю так:

Это fla файл:

Код AS3:

var mstate:int = 0; // начальное состояние  программы
var tact:Timer = null;
 
function init() {        trace("INIT");}
 
function doSomething(){        trace("DO SOMETHING");}
 
function doSomethingElse()  { trace("DO SOMETHING ELSE"); }
 
function end() { trace("END"); }
 
 
function nowDoIt (event:TimerEvent):void
{
        doSomethingElse();
        mstate = 3;
}
 
function pauseDoSomethingElse()
{
        if(tact == null)
        {
                tact = new Timer(5000,1);
                tact.addEventListener(TimerEvent.TIMER_COMPLETE, nowDoIt);
                tact.start();
        }
}
 
 
function main(event:Event)
{
        if(mstate == 0)
        {
                init();
                mstate = 1;
        }
        else if(mstate == 1)
        {
                doSomething();
                mstate = 2;
        }
        else if (mstate == 2)
        {
                pauseDoSomethingElse();
        }
        else if (mstate == 3)
        {
                end();
                mstate = 4;
        }
 
}

Но возникают проблемы с отрисовкой карт. Поэтому и возник вопрос о другой реализации пауз.


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

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