2

我正在使用 Java 和 Slick2D API 开发基于图块的策略游戏。

到目前为止一切顺利,但我的选项菜单陷入了停顿。我计划让用户能够在游戏过程中更改分辨率(毕竟这很常见)。

我已经可以切换到全屏并回到窗口,这很简单......

//"fullScreenOption" is a checkbox-like button.
if (fullScreenOption.isMouseOver(mouseX, mouseY)) {
   if (input.isMouseButtonDown(Input.MOUSE_LEFT_BUTTON)) {
      fullScreenOption.state = !fullScreenOption.state;
      container.setFullscreen(fullScreenOption.state);
   }
}

但是容器类(由 Slick 实现,不是我),与我之前的想法相反,似乎没有任何显示模式/分辨率更改功能!而且情况差不多……

我知道这是可能的,但我不知道负责的类是什么(如果存在的话)!

AppGameContainer 类,在游戏初始化开始时使用,是迄今为止我发现的唯一具有更改显示模式的函数的地方,但它仅在开始时使用,并且在 Slick 的教程中,被实现为本地。

//This is my implementation of it...
  public static void main(String[] args) throws SlickException {
    AppGameContainer app = new AppGameContainer(new Main());
//    app.setTargetFrameRate(60);
    app.setVSync(true);
    app.setDisplayMode(800, 600, false);
    app.start();
  }

我可以将它定义为 Main 类上的静态全局,以便update()在选项屏幕的方法中使用它,但这可能是一种(非常)糟糕的方法......

4

3 回答 3

4

有一个简单的方法可以做到这一点。我在另一个网站上找到了这个。您可以将 GameContainer 对象(您从更新方法获得的对象)转换为 AppGameContainer 方法。然后您可以访问 setDisplayMode:

AppGameContainer gc = (AppGameContainer) container;
gc.setDisplayMode(800, 600, false);

原帖在这里。

于 2013-08-31T23:29:54.750 回答
2

在咨询了 gamedev.stackexchange 和 Slick2D 的论坛之后,我解决问题的措施是混合使用 @normalocity 的解决方案、ScalableGame 接口的使用,以及最重要的是,编译我自己的 API 版本(因为它是开源的)。

对 API 的更改包括但不限于更直接地访问 Container 的setDisplayMode(),解决了与此问题相关的问题。

对于任何有相同或相似问题的人,这是我建议的解决方案。

编辑注意:虽然我的回答仍然有效,而且我没有使用 Slick2D 进行开发,但从正面投票和缺乏指出任何问题的评论来看,@Requios 的回答是没有任何问题的更好方法。这就是我推荐的方法,因此我将“选择的答案”切换为他的,并投了我自己的赞成票。

于 2012-07-31T15:43:13.470 回答
2

从理论上讲,您所要做的就是创建一个新AppGameContainer对象,然后重新运行所有初始化代码,除了重置游戏状态的代码(毕竟,您不希望游戏重置为其初始状态) )。

你是对的,教程没有涵盖这一点,所以我认为你没有遗漏任何东西。以下是更改分辨率时必须处理的问题列表。只要您将它们分解为单独的方法,以便您可以init在游戏中的任何时间重新运行,那么您应该没问题。

  • 您的render方法在确定要绘制的内容时,需要在每次执行时检查当前分辨率。换句话说,该render方法不应该关心当前的分辨率是什么 - 它应该每次都查找它,并做适当的事情。
  • 如果您正在使用 Slick 按钮和其他 UI 事件,包括事件侦听器,那么在重新初始化所有内容之前,您需要获取所有订阅侦听器的列表,在 new 中重新初始化您的 UI 元素AppGameContainer,并拥有所有侦听器重新订阅新元素。
  • init分析您的代码并查找依赖于特定状态的 UI 的任何其他位置,并在分辨率更改时从该方法重新初始化它。

所以,这个的伪代码版本是:

当您的游戏首次启动时

main(args)
  - initi()
    if (gameStartingForTheFirstTime())
      - initUI()
      - initGameState()
      - initWhateverElseYouNeedToForYourGame()
    if (resolutionChanging())
      - initUI()
于 2012-06-06T13:16:14.690 回答