2

私はJavaとSlick2DAPIを使用してタイルベースの戦略ゲームを開発しています。

これまでのところ順調ですが、オプションメニューが停止しました。ユーザーがゲームプレイ中に解像度を変更できるようにする計画があります(結局のところ、これはかなり一般的です)。

私はすでにフルスクリーンに変更してウィンドウに戻すことができます、これは非常に簡単でした...

//"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オブジェクト(updateメソッドから取得したオブジェクト)をAppGameContainerメソッドにキャストできます。次に、setDisplayModeにアクセスできます。

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

元の投稿はこちら。

于 2013-08-31T23:29:54.750 に答える
2

理論的には、新しいAppGameContainerオブジェクトを作成してから、ゲームの状態をリセットするコードを除いて、すべての初期化コードを再実行するだけです(結局、ゲームを開始状態にリセットしたくないのです) )。

チュートリアルがこれをカバーしていないのは正しいので、私はあなたが何かを見逃しているとは思わない。解像度を変更するときに処理する必要がある懸念事項のリストを次に示します。initゲーム内でいつでも再実行できるように、これらを別々のメソッドに分割する限り、問題はありません。

  • メソッドrenderは、何を描画するかを決定するときに、実行ごとに現在の解像度を確認する必要があります。別の言い方をすれば、renderメソッドは現在の解像度が何であるかを気にする必要はありません。毎回それを調べて、適切なことを実行する必要があります。
  • AppGameContainerSlickボタンやイベントリスナーを含むその他のUIイベントを使用している場合は、すべてを再初期化する前に、サブスクライブされているすべてのリスナーのリストを取得し、新しいでUI要素を再初期化して、すべてを取得する必要があります。リスナーは新しい要素を再サブスクライブします。
  • コードを分析し、UIが特定の状態であることに依存する他の場所を探しinit、解像度が変更されたときにメソッドからコードを再初期化します。

したがって、これの擬似コードバージョンは次のとおりです。

ゲームが最初に起動したとき

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

gamedev.stackexchangeとSlick2Dのフォーラムも参照した後、問題を解決するために私が取ったアクションは、@ normalocityのソリューション、ScalableGameインターフェースの使用、そして最も重要なことに、自分のバージョンのAPIをコンパイルすることを組み合わせて使用​​することでした。 (オープンソースであるため)。

setDisplayMode()APIへの変更には、この質問に関連する問題を解決した、コンテナへのより直接的なアクセスが含まれますが、これに限定されません。

同じまたは同様の問題を抱えている人にとって、これは私が提案する解決策です。

編集-注:私の答えはまだ有効であり、Slick2Dで開発していませんが、賛成票と問題を指摘するコメントの欠如から判断すると、@Requiosの答えは問題のないより良いアプローチです。それが私がお勧めするアプローチであり、それに応じて「選択された答え」を彼に切り替え、自分自身の賛成票を投じました。

于 2012-07-31T15:43:13.470 に答える