XNA 按钮点击未触发
XNA button click not fired
我创建了一个按钮 class 并在主游戏中调用它 class。但它没有开火。实际上,当我单击鼠标左键时,我想触发 Button class 内部的 Update 方法。我正在通过 Debug.WriteLine 检查所有鼠标事件,一切看起来都正常。有什么问题吗?
GameBaseclass
public class GameBase : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
Button btn;
public GameBase()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
graphics.PreferredBackBufferWidth = 600;
graphics.PreferredBackBufferHeight = 400;
}
protected override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
btn = new Button(Content.Load<Texture2D>("Sprites/Button"), new Vector2(150, 150));
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
MouseState mouse = Mouse.GetState();
//Debug.WriteLine(mouse);
if (btn.Clicked == true)
{
Debug.WriteLine("Clicked");
currentState = GameState.Playing;
btn.Update(mouse);
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(Content.Load<Texture2D>("Sprites/StartBg"), new Rectangle(0, 0, _screenWidth, _screenHeight), Color.White);
btn.Draw(spriteBatch);
spriteBatch.End();
base.Draw(gameTime);
}
}
按钮class
public class Button
{
public bool Clicked { get; set; }
private Texture2D _image;
private Rectangle _rectangle, _mouseRectangle;
private Vector2 _coordinate;
private Color _color;
private bool _down;
public Button(Texture2D image, Vector2 coordinate)
{
_image = image;
_coordinate = coordinate;
}
public void Update(MouseState mouse)
{
mouse = Mouse.GetState();
_rectangle = new Rectangle((int)_coordinate.X, (int)_coordinate.Y, _image.Width, _image.Height);
_mouseRectangle = new Rectangle(mouse.X, mouse.Y, 1, 1);
if (_mouseRectangle.Intersects(_rectangle))
{
if (_color.A == 255)
_down = false;
if (_color.A == 0)
_down = true;
if (_down)
{
_color.A += 3;
}
else
{
_color.A -= 3;
}
if (mouse.LeftButton == ButtonState.Pressed)
{
Clicked = true;
}
else if (_color.A < 255)
{
_color.A += 3;
Clicked = false;
}
}
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(_image, _coordinate, Color.White);
}
}
你的逻辑有点乱。简而言之,您的代码是:如果单击按钮,请执行更新,在其中检查它是否被单击。这样你就永远不会更新你的按钮。
试试这个 Update
函数的修改版本:
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
MouseState mouse = Mouse.GetState();
//Debug.WriteLine(mouse);
btn.Update(mouse);
if (btn.Clicked == true)
{
Debug.WriteLine("Clicked");
currentState = GameState.Playing;
}
base.Update(gameTime);
}
这句代码的意思是:更新按钮,检查按钮是否被点击,然后,如果按钮被点击,在调试中写入 "Clicked" 并将 gameState 设置为 Playing。
编辑 1:
另外,我看不出颜色应该如何与点击相关。
在按钮更新方法中,我担心代码的和平
if (mouse.LeftButton == ButtonState.Pressed)
{
Clicked = true;
}
else if (_color.A < 255)
{
_color.A += 3;
Clicked = false;
}
我宁愿这样写:
if (mouse.LeftButton == ButtonState.Pressed)
{
Clicked = true;
}
else
{
if (_color.A < 255)
_color.A += 3;
Clicked = false;
}
这样就可以更简单地将这段代码放在一个句子中,这种简单性使得无论 _color.A 是什么值它都可以工作,但是 _color.A 也会在您需要时更新。
我创建了一个按钮 class 并在主游戏中调用它 class。但它没有开火。实际上,当我单击鼠标左键时,我想触发 Button class 内部的 Update 方法。我正在通过 Debug.WriteLine 检查所有鼠标事件,一切看起来都正常。有什么问题吗?
GameBaseclass
public class GameBase : Microsoft.Xna.Framework.Game
{
GraphicsDeviceManager graphics;
Button btn;
public GameBase()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
IsMouseVisible = true;
graphics.PreferredBackBufferWidth = 600;
graphics.PreferredBackBufferHeight = 400;
}
protected override void Initialize()
{
base.Initialize();
}
protected override void LoadContent()
{
spriteBatch = new SpriteBatch(GraphicsDevice);
btn = new Button(Content.Load<Texture2D>("Sprites/Button"), new Vector2(150, 150));
}
protected override void UnloadContent()
{
}
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
MouseState mouse = Mouse.GetState();
//Debug.WriteLine(mouse);
if (btn.Clicked == true)
{
Debug.WriteLine("Clicked");
currentState = GameState.Playing;
btn.Update(mouse);
}
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(Content.Load<Texture2D>("Sprites/StartBg"), new Rectangle(0, 0, _screenWidth, _screenHeight), Color.White);
btn.Draw(spriteBatch);
spriteBatch.End();
base.Draw(gameTime);
}
}
按钮class
public class Button
{
public bool Clicked { get; set; }
private Texture2D _image;
private Rectangle _rectangle, _mouseRectangle;
private Vector2 _coordinate;
private Color _color;
private bool _down;
public Button(Texture2D image, Vector2 coordinate)
{
_image = image;
_coordinate = coordinate;
}
public void Update(MouseState mouse)
{
mouse = Mouse.GetState();
_rectangle = new Rectangle((int)_coordinate.X, (int)_coordinate.Y, _image.Width, _image.Height);
_mouseRectangle = new Rectangle(mouse.X, mouse.Y, 1, 1);
if (_mouseRectangle.Intersects(_rectangle))
{
if (_color.A == 255)
_down = false;
if (_color.A == 0)
_down = true;
if (_down)
{
_color.A += 3;
}
else
{
_color.A -= 3;
}
if (mouse.LeftButton == ButtonState.Pressed)
{
Clicked = true;
}
else if (_color.A < 255)
{
_color.A += 3;
Clicked = false;
}
}
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(_image, _coordinate, Color.White);
}
}
你的逻辑有点乱。简而言之,您的代码是:如果单击按钮,请执行更新,在其中检查它是否被单击。这样你就永远不会更新你的按钮。
试试这个 Update
函数的修改版本:
protected override void Update(GameTime gameTime)
{
if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
this.Exit();
MouseState mouse = Mouse.GetState();
//Debug.WriteLine(mouse);
btn.Update(mouse);
if (btn.Clicked == true)
{
Debug.WriteLine("Clicked");
currentState = GameState.Playing;
}
base.Update(gameTime);
}
这句代码的意思是:更新按钮,检查按钮是否被点击,然后,如果按钮被点击,在调试中写入 "Clicked" 并将 gameState 设置为 Playing。
编辑 1:
另外,我看不出颜色应该如何与点击相关。
在按钮更新方法中,我担心代码的和平
if (mouse.LeftButton == ButtonState.Pressed)
{
Clicked = true;
}
else if (_color.A < 255)
{
_color.A += 3;
Clicked = false;
}
我宁愿这样写:
if (mouse.LeftButton == ButtonState.Pressed)
{
Clicked = true;
}
else
{
if (_color.A < 255)
_color.A += 3;
Clicked = false;
}
这样就可以更简单地将这段代码放在一个句子中,这种简单性使得无论 _color.A 是什么值它都可以工作,但是 _color.A 也会在您需要时更新。