2

最近、XNA (Java 由来) の使用を開始し、ゲーム画面の表示で問題が発生しました。XNA をロードすると、game.cs クラスが与えられます。これは、ゲーム内の単一の自己完結型画面を描画するための関数のセットであると解釈しました。すべての異なる画面のコードをこの 1 つのクラスに入力すると、明らかに非常に面倒になるので、変更を処理するために以下のクラスを作成しました。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace Colonies
{
    public class GameManager //manages game screens
    {
        Microsoft.Xna.Framework.Game currentScreen;

        public enum screens { menu, game, summary };

        public GameManager()
        {
            initialize();
        }

        public void initialize()
        {
            currentScreen = new Menu(this);
            ((Menu)currentScreen).Run();
        }

        public void changeScreen(int i) 
        {
            switch (i)
            {
                case 0:
                    currentScreen = new Menu(this);
                    ((Menu)currentScreen).Run();
                    break;
                case 1:
                    currentScreen = new World(this);
                    ((World)currentScreen).Run();
                    break;
                case 2:
                    currentScreen = new Summary(this);
                    ((Summary)currentScreen).Run();
                    break;
            }
        }
}

}

ただし、これらの変更のいずれかがトリガーされると、ゲームの実行を複数回呼び出すことができないというエラー フラグが表示されます。これは、単一の汎用ゲーム画面を持つという最初の見積もりが実際に正しいことを意味しますか?! メインのgame.csクラスでメソッドが呼び出されるゲームのような画面について、代わりにマネージャーにする必要がありますか?

すなわち

たとえば、game.cs update メソッドでは次のようになります。

protected override void Update(GameTime gameTime)
{
    // Allows the game to exit
    if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
        this.Exit();

    // TODO: Add your update logic here
    aGameManager.getAGameObject.DoAnUpdate();
    base.Update(gameTime);
}

したがって、基本的に、メインのゲーム クラスが再度実行されることはなく、表示内容が変更されるだけです。これは正しい解決策でしょうか?(ゲームクラスの多くが隠されているため、正しい使用方法がわかりません)

4

2 に答える 2

1

Gameクラスはゲーム全体です。それが と呼ばれる理由Gameです。必要に応じて、それぞれが異なる画面を制御する「画面」オブジェクトを作成しGame、「ゲームマネージャー」を使用しようとしていたようにクラスを使用できます。

例えば:

public static int currentScreen = 0; // Any screen can change this variable when needed


List<Screenobject> myscreens = new List<Screenobject>(); // Populate this with screens
// OR
menuscreen = new menuScreen();
otherscreen = new otherScreen();
// ...


protected override void Update(GameTime gameTime)
{
      myscreens[currentScreen].Update(gameTime);
      // OR
      switch (currentScreen)
      {
          case 1:
               menuscreen.Update(gameTime); break;
          // ...
      }
      base.Update(gameTime);
}

Draw(..)同じUpdate(..)

于 2013-07-11T02:16:42.697 に答える
0

列挙子を作成

enum gamestate
   mainmenu
   gameplay
   options
end enum

そして、単に更新(描画)のメイン関数で

if gamestate = mainmenu then mainmenu.update();
if gamestate = gameplay then gameplay.update()
于 2013-07-11T06:47:37.703 に答える