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