我更改了我的代码但它仍然无效。我在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);
}
}
答案 0 :(得分:4)
您的问题并不了解枚举类型的工作原理。具体来说,这一行:
game1.GameStates = IntroState;
首先,让我们讨论一下enum实际上是什么。它是一个简单地将名称分配给整数值的结构,然后可以通过名称引用每个值,从而使代码更具可读性(因为它比direction = Dir.Up
更容易理解direction = 1
。)
请注意我如何使用这两个示例语句。在代码中,您将枚举视为类型而不是变量,这就是您遇到的问题。事实上,你的问题是双重的。第一个问题是您尝试为结构赋值,这类似于编写int = 4
- 即它没有意义。您的第二个问题是枚举不是全局的,因此IntroState
在game1
之外没有任何意义。
有趣的是,您已经正确设置了系统,因为您拥有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;
您需要完全限定该枚举值。