我在业余时间制作2D太空射击游戏,以便在大学开始之前在c#中练习。但是,我遇到了一个我似乎无法弄清楚的问题。对于菜单,我按照Youtube教程了解如何制作菜单,但按钮没有显示。我花了最近几天试图解决它,但没有运气因此,任何帮助将不胜感激。如果代码令人困惑我道歉,我还在学习。当我运行游戏时,我没有任何错误,我只得到一个没有显示按钮的空白蓝屏。
按钮类
DS$Factor
相关Game1.CS代码:
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Game1
{
class Button : Game1
{
Texture2D texture;
Vector2 position;
Rectangle rectangle;
Color colour = new Color(255, 255, 255, 255);
public Vector2 size;
bool down;
public bool isClicked;
public Button(Texture2D newText, GraphicsDevice graphics)
{
texture = newText;
size = new Vector2(graphics.Viewport.Width / 20, graphics.Viewport.Height / 10);
}
public void Update(MouseState mouse)
{
rectangle = new Rectangle((int)position.X, (int)position.Y,
(int)size.X, (int)size.Y);
Rectangle mouseRect = new Rectangle(mouse.X, mouse.Y, 1, 1);
if (mouseRect.Intersects(rectangle))
{
if (colour.A == 255) // if only one thing is in an if statement curly braces aren't needed
down = false;
if (colour.A == 0)
down = true;
if (down) colour.A += 3;
else colour.A -= 3;
if (mouse.LeftButton == ButtonState.Pressed)
isClicked = true;
}
// Once the mouse cursor has moved away from the button, the opacity will begin to increase.
else if (colour.A < 255)
{
colour.A += 3;
isClicked = false;
}
}
public void setPosition(Vector2 newPosition)
{
position = newPosition;
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(texture, rectangle, colour);
}
}`
}
我已经拿出了一些与手头问题无关的代码。如果您更容易解决问题,请告诉我,我将发布game1类的所有代码。
非常感谢。
答案 0 :(得分:2)
虽然这个代码中有许多改进的空间(为什么你的按钮继承自Game1类只是作为一个例子)我相信你的问题是由于你的按钮永远不会初始化矩形属性。您在构造函数中设置了大小,但是在调用update方法之前,您的矩形永远不会被初始化/设置。在调用button.Update方法之前的含义是你的矩形的宽度和高度为0,0。你的button.Update方法在单击按钮之前不会被调用。这就是按钮不可见的原因。因此,要解决您的问题,请在构造函数中初始化矩形。
public Button(Texture2D newText, GraphicsDevice graphics)
{
texture = newText;
size = new Vector2(graphics.Viewport.Width / 20, graphics.Viewport.Height / 10);
rectangle = new Rectangle(0, 0, size.X, size.Y);
}