【问题标题】:Strategy design pattern - stopping the method策略设计模式 - 停止方法
【发布时间】:2014-02-03 22:07:21
【问题描述】:

我正在开发一款 Java 游戏。我使用 libGDX 作为库。我显然在使用 Strategy 设计模式。

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

  1. SpawnMapScreen 的 render(float delta) 方法被调用
  2. 在SpawnMapScreen的render(float delta)方法中,调用BaseScreen的render(float delta)方法
  3. 在BaseScreen中,检查是否按下了escape键,如果是,则切换屏幕
  4. 继续使用 SpawnMapScreen 的 render(float delta) 方法。

它应该如何工作:

  1. SpawnMapScreen 的 render(float delta) 方法被调用
  2. 在SpawnMapScreen的render(float delta)方法中,调用BaseScreen的render(float delta)方法
  3. 在BaseScreen中,检查是否按下了escape键,如果是,则切换屏幕
  4. 不要继续 de SpawnMapScreen 的 render(float delta) 方法

有没有办法这样做?

【问题讨论】:

  • 好吧,你能在 SpawnMapScreen 类中使用你的 esc-key-detection 方法吗(因为它是从 BaseScreen 派生的)?
  • 你如何切换屏幕?
  • @webuster 我不想这样做,因为 SpawnMapScreen 不是唯一的 BaseScreen 实例。我也有cave1Screen、cave2Screen等。我不想到处复制粘贴相同的代码
  • @Lestat 我没有展示我如何在代码中实际切换屏幕,但我只是调用我自己的方法:SimpleTools.switchScreens(Screen screen),它比调用我的游戏实例 setScreen(Screen屏幕)方法。

标签: java oop design-patterns libgdx


【解决方案1】:

您只需要一个全局(如该函数所在的类的成员)布尔标志来检查 SpawnMapScreen 以确定是否执行任何操作。或者它可以检查当前的屏幕成员。

【讨论】:

  • 没有更清洁的方法吗?我的意思是您的解决方案有效,但不是阅读理解的最佳解决方案......并且拥有标志还包括复制粘贴 if 语句......
  • 你有一个方法setScreen(Screen screen) 所以我假设screen 的值是在一个成员中。因此,正如我所提到的,更简洁的方法是检查该值。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】: