2012-12-14 56 views
0

我改變了我的代碼,但它仍然無法正常工作。我在Intro類中得到這個錯誤信息: 'GameStates':不能通過一個表達式引用一個類型;嘗試'menuinterface.Game1.GameStates'而不是'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

您的問題不瞭解枚舉類型如何工作。具體來說,這一行:

game1.GameStates = IntroState; 

首先,我們來討論一下枚舉實際上是什麼。它是一種簡單地將名稱分配給整數值的結構,然後可以通過名稱引用每個值,從而使代碼更具可讀性(因爲它比direction = 1更容易理解direction = Dir.Up)。

請注意,我如何使用這兩個示例語句。在代碼中,您將枚舉視爲類型而不是變量,這是您遇到的問題。事實上,你的問題是雙重的。第一個問題是你試圖給一個結構賦值,這與編寫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)的一部分,因此需要顯式訪問。

希望這有助於您理解枚舉類型是如何工作的,以及爲什麼您編寫的代碼沒有意義,並且因此破壞了原因。

+0

我改變了我的代碼(看看上面的問題),但它仍然不起作用。我在Intro類中得到這個錯誤信息: 'GameStates':不能通過一個表達式引用一個類型;嘗試'menuinterface.Game1.GameStates'而不是 – Andy

+1

當引用IntroState時,您可能必須使用類名稱而不是實例名稱,因此Game1.GameStates.IntroState而不是game1.GameStates.IntroState。 – Hoeloe

+0

Thanx。它現在有效。 – Andy

0

做什麼錯誤消息說:

game1.GameStates = Game1.GameStates.IntroState; 

你的東東d來完全限定該枚舉值。

相關問題