2014-02-03 4 views
0

Я работаю над игрой на Java. Я использую библиотеку libGDX. Я, по-видимому, использую схему дизайна .Схема разработки стратегии - остановка метода

Вот мой класс SpawnMapScreen. Он расширяет BaseScreen.

public void render(float delta) { 
    super.render(delta); 

    npcTalking.update(Gdx.graphics.getDeltaTime()); 
    npcRunning.update(Gdx.graphics.getDeltaTime()); 

    renderer.getSpriteBatch().begin(); 
    WorldVars.player.draw(renderer.getSpriteBatch()); 
    npcTalking.draw(renderer.getSpriteBatch()); 
    npcRunning.draw(renderer.getSpriteBatch()); 
    renderer.getSpriteBatch().end(); 
} 

Вот мой класс BaseScreen. Он реализует экран.

public void render(float delta) { 
    Gdx.graphics.setTitle("AHH V. " + version + " || Running at a mighty " + Gdx.graphics.getFramesPerSecond() + "fps"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ 
    Gdx.gl.glClearColor(0, 0, 0, 0); 
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT); 

    WorldVars.player.update(Gdx.graphics.getDeltaTime()); 

    renderer.setView(camera); 
    renderer.render(); 
    camera.position.set(WorldVars.player.getX() + WorldVars.player.getWidth()/2, WorldVars.player.getY() + WorldVars.player.getHeight()/2, 0); 
    camera.update(); 

    spriteBatch.begin(); 
    font.draw(spriteBatch, version, 0, 100); 
    spriteBatch.end(); 
} 

Вот моя проблема. В моем классе BaseScreen я хочу проверить, нажата ли клавиша escape. Если это так, я хочу переключать экраны. Дело в том, что когда я вызываю метод setScreen(Screen screen) экземпляра игрового экземпляра, он меняет экран, но продолжает процесс в методе рендеринга. Это выглядит следующим образом:

  1. SpawnMapScreen визуализируем метод (флоат дельта) называется
  2. В SpawnMapScreen визуализируем (флоат дельта) метод, BaseScreen визуализируем метод (флоат дельта) называется
  3. В BaseScreen, он проверяет если нажата клавиша эвакуации, если да, то она меняет экран
  4. Продолжить метод рендеринга SpawnMapScreen (float delta).

Как должен работать: метод

  1. SpawnMapScreen визуализируем метод (флоат дельта) называется
  2. В SpawnMapScreen визуализируем (флоат дельта) метод, BaseScreen визуализируем (флоат дельта) называется
  3. В BaseScreen, он проверяет, является ли клавиша выхода нажата, если да, то он изменяет экран
  4. не продолжайте де SpawnMapScreen визуализируем (поплавок дельта) мето d

Есть ли способ сделать так?

+0

Хорошо, можете ли вы использовать метод обнаружения esc-ключа в вашем классе SpawnMapScreen (поскольку он получен из BaseScreen)? – webuster

+0

Как вы переключаете экраны? – Lestat

+0

@webuster Я не хочу, потому что SpawnMapScreen - не единственный экземпляр BaseScreen. У меня также есть cave1Screen, cave2Screen и т. Д. Я не хочу копировать один и тот же код всего вокруг – Ferdz

ответ

0

Я изменил способ обработки входных данных. Фактически, я выбрал класс InputProcessor (называемый InputSystem), чтобы я мог обрабатывать все мои входы в одном и том же месте. Каждый раз, когда создается новый BaseScreen, я также звоню Gdx.input.setInputProcessor(new InputSystem)

1

Вам просто нужен глобальный (как в члене класса, в котором эта функция находится) булевский флаг, чтобы проверить в SpawnMapScreen, чтобы определить, делать что-либо или нет. Или он может проверить текущий элемент экрана для этого.

+0

Разве нет более чистого способа сделать это? Я имею в виду, что ваше решение работает, но не является оптимальным для понимания чтения ... И наличие флага также включает в себя копию, вставляющую инструкцию if ... – Ferdz

+0

У вас есть метод 'setScreen (Экран)', поэтому я принимаю значение из 'screen' происходит в члене. Таким образом, более чистый способ - проверить эту ценность, как я уже упоминал. – developerwjk

0

Я не вижу в этом примера использования стратегии. Вся идея стратегии - это подключаемый способ сделать что-то. Например, LayoutManagers в Swing или сортировка (например, Bubble vs. Quicksort или что-то еще). Если у вас есть куча условной логики, это должно быть, вероятно, либо вне реализации Стратегии.

На самом деле, прочитав это снова, я у вас есть конкретное предложение: используйте шаблон состояния. Что бы вы сделали, у вас есть 2 обработчика состояний, а затем вы прослушиваете клавишу эвакуации, и когда она была нажата, вы меняете в EscapeHandler, который реализует вариантное поведение перед вызовом макета ,

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