1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
| public abstract class Button<T>
{
public Texture2D Texture { get; private set; }
public Vector2 Position { get; private set; }
private Vector2 Origin;
private SpriteFont Font;
private string Text;
private Vector2 TextOrigin;
private Color[] Colour;
private byte ActiveColour;
private bool ActiveClick;
private bool BlockClick;
public abstract void Action(ref T param); // The reference is used in this case to pass the value of '_gameState', see inheriting classes.
public Button(Texture2D texture, int posX, int posY, SpriteFont font, string text)
{
this.Texture = texture;
this.Position = new Vector2(posX, posY);
this.Origin = new Vector2(
this.Texture.Bounds.Center.X,
this.Texture.Bounds.Center.Y
);
this.Font = font; this.Text = text;
Vector2 textSize = this.Font.MeasureString(this.Text);
this.TextOrigin = textSize * .5f;
this.Colour = new Color[3] {
Color.FromNonPremultiplied(225, 225, 225, 255),
Color.FromNonPremultiplied(255, 255, 255, 255),
Color.FromNonPremultiplied(155, 155, 155, 255)
};
this.ActiveColour = 0;
this.ActiveClick = false;
this.BlockClick = false;
}
public void Update(MouseState mState, ref T param)
{
bool inBox = (mState.X > this.Position.X - this.Texture.Bounds.Center.X
&& mState.X < this.Position.X + this.Texture.Bounds.Center.X
&& mState.Y > this.Position.Y - this.Texture.Bounds.Center.Y
&& mState.Y < this.Position.Y + this.Texture.Bounds.Center.Y);
if (!inBox && !this.BlockClick && mState.LeftButton == ButtonState.Pressed)
this.BlockClick = true;
else if (this.BlockClick && mState.LeftButton == ButtonState.Released)
this.BlockClick = false;
else if (!this.BlockClick)
{
if (inBox && mState.LeftButton == ButtonState.Pressed)
{
if (this.ActiveColour != 2) this.ActiveColour = 2;
if (!this.ActiveClick) this.ActiveClick = true;
}
else if (inBox && this.ActiveClick)
{
this.ActiveClick = false;
this.Action(ref param);
}
else if (this.ActiveClick)
{
this.ActiveClick = false;
this.ActiveColour = 0;
}
else if (!inBox && this.ActiveColour != 0) this.ActiveColour = 0;
else if (inBox && this.ActiveColour != 1) this.ActiveColour = 1;
}
}
public void Draw(SpriteBatch spriteBatch)
{
spriteBatch.Draw(
this.Texture,
this.Position,
null,
this.Colour[this.ActiveColour],
0f,
this.Origin,
1f,
SpriteEffects.None,
0f
);
spriteBatch.DrawString(
this.Font,
this.Text,
this.Position,
Color.Black,
0f,
this.TextOrigin,
1,
SpriteEffects.None,
0f
);
}
}
public class ButtonSetControls : Button<Keys[]>
{
Keys[] WASD, ZQSD;
public ButtonSetControls(Texture2D texture, int posX, int posY, SpriteFont font, string text)
: base(texture, posX, posY, font, text)
{
WASD = new Keys[4] { Keys.W, Keys.S, Keys.A, Keys.D };
ZQSD = new Keys[4] { Keys.Z, Keys.S, Keys.Q, Keys.D };
}
public override void Action(ref Keys[] playerControl)
{
if (playerControl == WASD)
playerControl = ZQSD;
else playerControl = WASD;
}
} |