0

コードを変更しましたが、それでも機能しません。Introクラスで次のエラーメッセージが表示されます。'GameStates':式を介して型を参照できません。代わりに「menuinterface.Game1.GameStates」を試してください

なにが問題ですか?プレーヤーがスペースキーを押した場合、ゲーム状態をMenuStateに設定したいと思います。
Game1クラス:

public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;
    private IState currentState;

    public enum GameStates
    {
        IntroState = 0,
        MenuState = 1,
        MaingameState = 2,
    }

    public GameStates CurrentState
    {
        get { return currentGameState; }
        set { currentGameState = value; }
    }

    private GameStates currentGameState = GameStates.IntroState;


    public Game1()
    {
        graphics = new GraphicsDeviceManager(this);
        Content.RootDirectory = "Content";
    }

    protected override void Initialize()
    {
        currentState = new Intro(this);
        base.Initialize();
    }

    protected override void LoadContent()
    {       
        spriteBatch = new SpriteBatch(GraphicsDevice);
        currentState.Load(Content);
    }

    protected override void Update(GameTime gameTime)
    {
        currentState.Update(gameTime);     
        KeyboardState kbState = Keyboard.GetState();
        base.Update(gameTime);
    }

    protected override void Draw(GameTime gameTime)
    {
        GraphicsDevice.Clear(Color.CornflowerBlue);
        spriteBatch.Begin();
        currentState.Render(spriteBatch);
        spriteBatch.End();

        base.Draw(gameTime);
    }
}

インターフェース:

public interface IState         
{ 
        void Load(ContentManager content); 
        void Update(GameTime gametime); 
        void Render(SpriteBatch batch); 
} 

イントロクラス:

public class Intro : IState
{
    private IState currentState;
    Texture2D Menuscreen;
    private Game1 game1;       

    public Intro(Game1 game)
    {
        game1 = game;
    }

    public void Load(ContentManager content)
    {
       Menuscreen = content.Load<Texture2D>("menu");
    }

    public void Update(GameTime gametime)
    {
        KeyboardState kbState = Keyboard.GetState();
        if (kbState.IsKeyDown(Keys.Space))
            game1.CurrentState = game1.GameStates.IntroState;
          currentState = new Menu(game1);
    }

    public void Render(SpriteBatch batch)
    {
        batch.Draw(Menuscreen, new Rectangle(0, 0, 1280, 720), Color.White);
    }
}
4

2 に答える 2

4

あなたの問題は、列挙型がどのように機能するかを理解していません。具体的には、次の行:

game1.GameStates = IntroState;

最初に、enum が実際に何であるかについて少し説明しましょう。これは、名前を整数値に割り当てるだけの構造であり、名前で各値を参照できるため、コードが読みやすくなります (direction = Dir.Upよりもはるかに理解しやすいためdirection = 1)。

ただし、これら 2 つのステートメント例をどのように使用しているかに注意してください。コードでは、 enum を変数としてではなくとして扱います。これが発生している問題です。実際、あなたの問題は2つあります。構造体に値を割り当てようとしている最初の問題 ID。これは書き込みに似ています。つまり、意味がありません。2番目の問題は、列挙型がグローバルではないため、外部では意味がないことです。int = 4IntroStategame1

興味深いことに、currentGameState実際に変更しようとしている変数があるため、システムを正しく設定しています。ただし、これはprivate変数であり、game1 クラスの外部からアクセスすることはできません。変数publicを作成するか、 を作成しpropertyてアクセスできます。後者は、変数の設定方法を制御できるため、良い方法です。これを作成するには、次のようなものを使用できます。

public GameStates CurrentState
{
    get { return currentGameState; }
    set { currentGameState = value; }
}

これを game1 クラスに追加したら、ゲームの状態を次のように設定できます。

game1.CurrentState = Game1.GameStates.IntroState;

このコードが、必要なものを探す場所をプログラムに伝える方法に注目してください。game1 内IntroStateの構造体 ( ) の一部であるため、明示的にアクセスする必要があります。GameStates

これにより、列挙型がどのように機能するか、記述したコードが意味をなさない理由、およびコードが壊れる理由を理解するのに役立つことを願っています。

于 2012-12-14T11:58:48.923 に答える
0

エラー メッセージの内容を実行します。

game1.GameStates = Game1.GameStates.IntroState;

その列挙値を完全に修飾する必要があります。

于 2012-12-14T11:49:34.663 に答える