'GameStates':不能通过表达式引用类型;请尝试'menuinterface.Game1.GameStates'

时间:2012-12-14 11:37:19

标签: c# xna

我更改了我的代码但它仍然无效。我在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);
    }
}

2 个答案:

答案 0 :(得分:4)

您的问题并不了解枚举类型的工作原理。具体来说,这一行:

game1.GameStates = IntroState;

首先,让我们讨论一下enum实际上是什么。它是一个简单地将名称分配给整数值的结构,然后可以通过名称引用每个值,从而使代码更具可读性(因为它比direction = Dir.Up更容易理解direction = 1。)

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

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

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

在你的game1课程中有了这个,你可以设置游戏状态:

game1.CurrentState = Game1.GameStates.IntroState;

请注意此代码如何告诉程序在哪里查找所需内容。 IntroState是game1中结构(GameStates)的一部分,因此需要明确访问。

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

答案 1 :(得分:0)

执行错误消息:

game1.GameStates = Game1.GameStates.IntroState;

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