策略设计模式 - 停止方法

时间:2014-02-03 22:07:21

标签: java oop design-patterns libgdx

我正在开发一个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类。它实现了Screen。

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类中,我想检查是否按下了转义键。如果是,我想切换屏幕。问题是,当我调用我的游戏实例的setScreen(Screen screen)方法时,它会更改屏幕,但会继续渲染方法中的过程。它是这样的:

  1. SpawnMapScreen的渲染(浮点增量)方法称为
  2. 在SpawnMapScreen的渲染(浮点增量)方法中,调用BaseScreen的渲染(浮点增量)方法
  3. 在BaseScreen中,它会检查是否按下了转义键,如果是,则更改屏幕
  4. 继续使用SpawnMapScreen的渲染(浮点增量)方法。
  5. 它应该如何运作:

    1. SpawnMapScreen的渲染(浮点增量)方法称为
    2. 在SpawnMapScreen的渲染(浮点增量)方法中,调用BaseScreen的渲染(浮点增量)方法
    3. 在BaseScreen中,它会检查是否按下了转义键,如果是,则更改屏幕
    4. 不要继续使用SpawnMapScreen的渲染(浮点增量)方法
    5. 有可能这样做吗?

3 个答案:

答案 0 :(得分:1)

你只需要一个全局(在该函数所在的类的成员中)布尔标志来检查SpawnMapScreen以确定是否做任何事情。或者它可以检查当前的屏幕成员。

答案 1 :(得分:0)

我改变了处理输入处理的方式。实际上,我选择了一个InputProcessor类(称为InputSystem),这样我就可以在同一个地方处理所有输入。每次创建新的BaseScreen时,我也会调用Gdx.input.setInputProcessor(new InputSystem)

答案 2 :(得分:0)

我不认为这是使用策略的情况。战略背后的整个想法是一种可插拔的做事方式。例如,Swing中的LayoutManagers或者排序(例如Bubble vs. Quicksort或者其他..如果你有一堆条件逻辑,那么它应该在Strategy实现之外。

实际上,在再次阅读时,我有一个具体的建议:使用状态模式。你要做的是有两个状态处理程序然后你监听转义键,当它被按下时,你交换EscapeHandler,它在调用布局之前实现变体行为。