123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- using System;
- using Microsoft.Xna.Framework;
- using Microsoft.Xna.Framework.Graphics;
- namespace FarseerPhysics.SamplesFramework
- {
- /// <summary>
- /// Helper class represents a single entry in a MenuScreen. By default this
- /// just draws the entry text string, but it can be customized to display menu
- /// entries in different ways. This also provides an event that will be raised
- /// when the menu entry is selected.
- /// </summary>
- public sealed class MenuButton
- {
- private Vector2 _baseOrigin;
- private bool _flip;
- private bool _hover;
- /// <summary>
- /// The position at which the entry is drawn. This is set by the MenuScreen
- /// each frame in Update.
- /// </summary>
- private Vector2 _position;
- private float _scale;
- private GameScreen _screen;
- /// <summary>
- /// Tracks a fading selection effect on the entry.
- /// </summary>
- /// <remarks>
- /// The entries transition out of the selection effect when they are deselected.
- /// </remarks>
- private float _selectionFade;
- private Texture2D _sprite;
- /// <summary>
- /// Constructs a new menu entry with the specified text.
- /// </summary>
- public MenuButton(Texture2D sprite, bool flip, Vector2 position, GameScreen screen)
- {
- _screen = screen;
- _scale = 1f;
- _sprite = sprite;
- _baseOrigin = new Vector2(_sprite.Width / 2f, _sprite.Height / 2f);
- _hover = false;
- _flip = flip;
- Position = position;
- }
- /// <summary>
- /// Gets or sets the position at which to draw this menu entry.
- /// </summary>
- public Vector2 Position
- {
- get { return _position; }
- set { _position = value; }
- }
- public bool Hover
- {
- get { return _hover; }
- set { _hover = value; }
- }
- public GameScreen Screen
- {
- get { return _screen; }
- }
- /// <summary>
- /// Updates the menu entry.
- /// </summary>
- public void Update(GameTime gameTime)
- {
- float fadeSpeed = (float)gameTime.ElapsedGameTime.TotalSeconds * 4;
- if (_hover)
- {
- _selectionFade = Math.Min(_selectionFade + fadeSpeed, 1f);
- }
- else
- {
- _selectionFade = Math.Max(_selectionFade - fadeSpeed, 0f);
- }
- _scale = 1f + 0.1f * _selectionFade;
- }
- public void Collide(Vector2 position)
- {
- Rectangle collisonBox = new Rectangle((int)(Position.X - _sprite.Width / 2f),
- (int)(Position.Y - _sprite.Height / 2f),
- (_sprite.Width),
- (_sprite.Height));
- if (collisonBox.Contains((int)position.X, (int)position.Y))
- {
- _hover = true;
- }
- else
- {
- _hover = false;
- }
- }
- /// <summary>
- /// Draws the menu entry. This can be overridden to customize the appearance.
- /// </summary>
- public void Draw()
- {
- SpriteBatch batch = _screen.ScreenManager.SpriteBatch;
- Color color = Color.Lerp(Color.White, new Color(255, 210, 0), _selectionFade);
- batch.Draw(_sprite, _position - _baseOrigin * _scale, null, color, 0f, Vector2.Zero,
- _scale, _flip ? SpriteEffects.FlipVertically : SpriteEffects.None, 0f);
- }
- }
- }
|