2011-01-05 1 views
0

У меня вопрос о создании флеш-игр в Flex. Прямо сейчас я разрабатываю 2D-файтинг, вот ссылка: http://xoz.netai.net/stickfightjx/StickFightJX.htmlЛучший способ оптимизировать мою игру в стиле «Homebrew Flex»?

Однако я не уверен, насколько эффективно я запрограммировал основной цикл.

Поскольку я никогда не читал учебник или не видел никаких других игр Adobe Flex, я не знал, как их реализовать. У меня есть экземпляр Timer, который вызывает функцию обновления каждые 24 кадра, которая обновляет все игровые объекты и представления.

Есть ли способ сделать это быстрее? Я что-то трачу?

// This is in an MXML Application 

private var timer:Timer = new Timer(1/24); 

private function onInitialize(e:Event):void 
{ 
    timer.addEventListener(TimerEvent.TIMER, onUpdate); 
    timer.start(); 
} 

private function onUpdate(e:TimerEvent):void 
{ 
    gameStateManager.update(); 
} 

ответ

1

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

Для гладкой анимации вы хотите прослушать событие ENTER_FRAME. Ваш метод update() должен принимать временную дельта с момента последнего кадра в качестве параметра. Вы можете использовать это, чтобы основывать свои вычисления на выключенном времени, а не на кадрах.

Например:

... 
// Called from your original code. 
private function update():void 
{ 
    xPos += 10; 
    yPos += 5; 
} 
... 

В этом случае объект обновление будет иметь его XPOS и членов YPos увеличилось на 10 и 5, соответственно, как часто, как событие таймера вызывается. На медленных компьютерах ЦП не сможет идти в ногу со временем, а время между обновлениями будет более продолжительным и замедлит всю вашу игру, что значительно облегчит бои.

Обновления также будут не синхронизированы с частотой кадров, в результате чего анимация будет выглядеть нестабильной. Это происходит потому, что иногда будет добавлено несколько обновлений, прежде чем холст будет снова отображен, что означает, что объект изменит свои xPos и ​​yPos на 20 и 10 для этого фрейма.

... 
// Called from ENTER_FRAME with the time since the last call passed in. 
private function update(deltaT:Number):void 
{ 
    xPos += 10 * deltaT; 
    yPos += 5 * deltaT; 
} 
... 

В этом случае объект обновления изменит свои XPOS и членов YPos на 10 и 5 соответственно один раз в секунду (если deltaT в секундах) независимо от того, насколько медленно процессор. Обновления также происходят один раз и только один раз для каждого отображения холста, поскольку вы используете событие ENTER_FRAME.

Смежные вопросы