使用Slick2D,如何在游戏过程中更改分辨率?

时间:2012-06-05 23:08:42

标签: java window resolution slick2d

我正在使用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()方法中使用它,但它可能是一种(非常)糟糕的方式... < / p>

3 个答案:

答案 0 :(得分:4)

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

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

Original post here.

答案 1 :(得分:2)

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

你是对的,教程不会涵盖这一点,所以我不认为你错过任何东西。以下是您在更改解决方案时必须处理的问题列表。只要你将这些分解为单独的方法,以便你可以在游戏中随时重新运行init,那么你应该没问题。

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

所以,伪代码版本是:

当您的游戏首次启动时

main(args)
  - initi()
    if (gameStartingForTheFirstTime())
      - initUI()
      - initGameState()
      - initWhateverElseYouNeedToForYourGame()
    if (resolutionChanging())
      - initUI()

答案 2 :(得分:2)

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

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

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

编辑 - 注意:虽然我的答案仍然有效,而且我没有使用Slick2D开发,但@Requios的答案是一个没有任何问题的更好的方法,从积极的投票和缺乏评论指出任何问题来判断。这就是我推荐的方法,因此我将“选择的答案”改为他的,并投下我自己的赞成。