2009-02-26 6 views
6

Редактировать: Это делает мне больше смысла, теперь я сделал шаг в сторону от кода, спасибо за помощь.Gameloop для j2me "пошаговая игра"

Только что нашел переполнение через день через Coding Horror, и это выглядит потрясающе. Рисунок, что я бы спросил сообщество о проблеме, которую я сейчас пытаюсь решить.

Я разрабатываю игру с рогейнами, используя j2me для телефонов midp 2.0. Проект все еще находится на основных этапах развития, поскольку я выясняю, как он будет работать. Часть, к которой я сейчас привязана, связана с потоками.

В игре есть пользовательский класс HaxCanvas, который расширяет GameCanvas и реализует runnable. Он запускает метод call repaint(), а затем спит в течение 50 мс, в результате получается частота кадров 20 FPS. Это позволяет мне писать остальную часть игры без необходимости перерисовывать всюду и делать анимации и эффекты более легкими в дальнейшем. (по крайней мере теоретически).

Поток игры контролируется классом GameManager, который пересекает всех NPC на карте, делая свои повороты, пока не станет чередой игрока. На этом этапе мне нужно ввести вход, чтобы игрок мог перемещаться и/или атаковать вещи. Я изначально звонил gameManager.runUntilHeroTurn() в методе keyPressed моего HaxCanvas. Однако после прочтения системных потоков j2me я понял, что использование метода с возможностью запуска в течение обратного вызова - плохая идея. Однако я должен использовать keyPressed для ввода ввода, так как мне нужен доступ к числовым клавишам, а getKeyStates() не поддерживает это.

Софтвер мои попытки поместить мой галлуп в свою собственную нить привели к катастрофе. Странное «uncached ArrayIndexOutOfBoundsException» без трассировки стека появляется после того, как игра запустилась на несколько оборотов.

Так я полагаю, мой вопрос заключается в следующем:

Для «пошаговых» игр в j2me, что это лучший способ реализовать цикл игры, позволяя для ввода handeling только тогда, когда это ход игрока?

+0

Кстати, хороший вопрос. +1 – Fostah

ответ

3

Я бы избегал нарезания резьбы для логики игры, поскольку нарезка J2ME, в зависимости от производителя, конечно же, не очень помогает распределять ограниченные ресурсы. Вы будете часто видеть паузы, пока поток выполняет тяжелую обработку. Я бы рекомендовал только темы для загрузки или подключения к сети, так как в этом случае вы просто дадите пользователю базовую обратную связь «Загрузка ...».

Чтобы справиться с этим, у меня не было бы суб-петель, чтобы обновлять каждый из AI в одном кадре.Я хотел бы сделать что-то вроде следующих в режиме выбега:

public void run() { 
    while(true) { 
     // Update the Game 
     if(gameManager.isUsersTurn()) { 
      // Collect User Input 
      // Process User Input 
      // Update User's State 
     } 
     else { 
      // Update the active NPC based on their current state 
      gameManager.updateCurrentNPC(); 
     } 

     // Do your drawing 
    } 
} 

Вы хотите, чтобы избежать все обновляется в одном кадре, как 1) обновление может быть медленным, в результате чего не немедленной визуальной обратной связи для пользователя 2) вы можете анимировать каждого отдельного NPC, когда они совершают свои действия. С помощью этой настройки у вас могут быть состояния NPC, NPC_DECIDE_MOVE и NPC_ANIMATING, что позволит вам дополнительно контролировать, что делает NPC. NPC_ANIMATING в основном поставит игру в состояние ожидания анимации, чтобы избежать дальнейшей обработки до завершения анимации. Затем он может перейти на следующий ход NPC.

Кроме того, у меня будет только gameManager.update() и gameManager.paint (g) (краска будет вызвана из краски), которая будет обрабатывать все и сохранить метод прогона тонким.

Наконец, вы заглянули в flushGraphics()? С GameCanvas вы обычно создаете объект Graphics, рисуете все до этого, а затем вызываете flushGraphics(), а затем ждите. Метод, который вы упомянули, - это способ решения проблемы для класса Canvas. Просто подумал, что упомянул бы об этом и разместил ссылку: Game Canvas Basics

5

Хотя не j2me специально вы должны захватить пользовательский ввод, общая стратегия заключается в том, чтобы поставить очередь на вход до его времени для обработки ввода.

input ---> queue <---> Manager(loop) 

Таким образом, вы можете даже вводить сценарий для целей отладки.

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

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