C# ';游戏状态';:无法通过表达式引用类型;试试';menuinterface.Game1.游戏状态';相反

C# ';游戏状态';:无法通过表达式引用类型;试试';menuinterface.Game1.游戏状态';相反,c#,xna,C#,Xna,我更改了代码,但仍然不起作用。我在简介类中收到以下错误消息: “GameStates”:无法通过表达式引用类型;请改为尝试“menuinterface.Game1.GameStates” 怎么了?如果玩家按下空格键,我想将游戏状态设置为MenuState。 游戏1类: public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch

我更改了代码,但仍然不起作用。我在简介类中收到以下错误消息: “GameStates”:无法通过表达式引用类型;请改为尝试“menuinterface.Game1.GameStates”

怎么了?如果玩家按下空格键,我想将游戏状态设置为MenuState。
游戏1类:

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);
    }
}
公共类简介:IState
{
私人国家;
纹理2D菜单屏幕;
私人游戏1游戏1;
公开介绍(游戏1)
{
游戏1=游戏;
}
公共无效加载(ContentManager内容)
{
Menuscreen=content.Load(“菜单”);
}
公开作废更新(游戏时间游戏时间)
{
KeyboardState kbState=Keyboard.GetState();
if(kbState.IsKeyDown(Keys.Space))
game1.CurrentState=game1.GameStates.IntroState;
当前状态=新菜单(游戏1);
}
公共无效渲染(SpriteBatch批处理)
{
batch.Draw(菜单绿色,新矩形(0,0,1280,720),彩色,白色);
}
}

按照错误消息所述执行:

game1.GameStates = Game1.GameStates.IntroState;

您需要完全限定该枚举值。

按照错误消息所述执行:

game1.GameStates = Game1.GameStates.IntroState;

您需要完全限定该枚举值。

您的问题是不理解枚举类型如何工作。具体而言,这一行:

game1.GameStates = IntroState;
首先,让我们讨论一下枚举实际上是什么。它是一种结构,只需将名称分配给整数值,然后就可以按名称引用每个值,从而使代码更具可读性(因为理解
direction=Dir.Up
direction=1
容易得多)

不过,请注意我是如何使用这两个示例语句的。在代码中,您将枚举视为类型而不是变量,这就是您遇到的问题。事实上,你的问题是双重的。您试图为结构赋值的第一个问题id,类似于写入
int=4
——也就是说,它没有意义。第二个问题是枚举不是全局的,因此
IntroState
game1
之外没有任何意义

有趣的是,您已经正确地设置了系统,因为您有
currentGameState
变量,这是您实际想要更改的。但是,它是一个
private
变量,不允许从game1类之外访问它。您可以将变量
设置为公共
,也可以创建
属性
来访问它。后者是一种很好的做法,因为它允许您控制变量的设置方式。要创建它,您可以使用如下内容:

public GameStates CurrentState
{
    get { return currentGameState; }
    set { currentGameState = value; }
}
一旦您在game1类中设置了此选项,您可以按如下方式设置游戏状态:

game1.CurrentState = Game1.GameStates.IntroState;
请注意,这段代码如何告诉程序在何处查找所需内容<代码>内部状态是game1中结构(
游戏状态
)的一部分,因此需要显式访问


希望这能帮助您理解枚举类型是如何工作的,以及为什么您编写的代码没有意义,从而导致代码中断。

您的问题在于不理解枚举类型是如何工作的。具体而言,这一行:

game1.GameStates = IntroState;
首先,让我们讨论一下枚举实际上是什么。它是一种结构,只需将名称分配给整数值,然后就可以按名称引用每个值,从而使代码更具可读性(因为理解
direction=Dir.Up
direction=1
容易得多)

不过,请注意我是如何使用这两个示例语句的。在代码中,您将枚举视为类型而不是变量,这就是您遇到的问题。事实上,你的问题是双重的。您试图为结构赋值的第一个问题id,类似于写入
int=4
——也就是说,它没有意义。第二个问题是枚举不是全局的,因此
IntroState
game1
之外没有任何意义

有趣的是,您已经正确地设置了系统,因为您有
currentGameState
变量,这是您实际想要更改的。但是,它是一个
private
变量,不允许从game1类之外访问它。您可以将变量
设置为公共
,也可以创建
属性
来访问它。后者是一种很好的做法,因为它允许您控制变量的设置方式。要创建它,您可以使用如下内容:

public GameStates CurrentState
{
    get { return currentGameState; }
    set { currentGameState = value; }
}
一旦您在game1类中设置了此选项,您可以按如下方式设置游戏状态:

game1.CurrentState = Game1.GameStates.IntroState;
请注意,这段代码如何告诉程序在何处查找所需内容<代码>内部状态是game1中结构(
游戏状态
)的一部分,因此需要显式访问


希望这能帮助您理解枚举类型是如何工作的,以及为什么您编写的代码没有意义,以及为什么它会中断。

我更改了代码(请看上面的问题),但它仍然不起作用。我在简介类“GameStates”中得到这个错误消息:无法通过表达式引用类型;请尝试使用“menuinterface.Game1.GameStates”,而不是“menuinterface.Game1.GameStates.IntroState”。在引用IntroState时,您可能必须使用类名而不是实例名,因此Game1.GameStates.IntroState,而不是Game1.GameStates.IntroState。相应地更新了我的答案。我更改了代码(查看上面的问题),但仍然无法使用。我在简介类“GameStates”中得到这个错误消息:无法通过表达式引用类型;请尝试使用“menuinterface.Game1.GameStates”,而不是“menuinterface.Game1.GameStates”。在引用IntroState时,您可能必须使用类名而不是实例名,因此Game1.GameStates.IntroState,而不是Game1.GameStates.IntroState。相应地更新了我的答案。