2012-10-17 5 views
2

J'ai un menu de jeu avec (pour l'instant) 1 photo (bouton). C'est un texture2D et je l'ai mis dans un tableau. Je veux savoir quand la souris survole ma photo. Actionscript avait une fonction intégrée appelée "hitTestObject". Mais il commence à sembler que je dois vérifier chaque pixel de l'image pour voir si la souris est là. Je suis ouvert à tout changer, je veux juste être en mesure de choisir des images différentes.C# sélection de souris XNA

Texture2D[] clickable_objects = new Texture2D[1]; 

clickable_objects[0] = Content.Load<Texture2D>("brain-icon"); 

public bool Intersects(Vector2 mouse_loc, Texture2D[] _objects) 
{ 
    int X = (int) mouse_loc.X; 
    int Y = (int) mouse_loc.Y; 

    if() //Mouse hovers over object[0] 
    return true; 
    else 
    return false; 
} 

Répondre

1

Utilisez Rectangle.Intersects

int X = (int) mouse_loc.X; 
    int Y = (int) mouse_loc.Y; 
    Rectangle MouseRect = new Rectangle(X,Y,1,1) 
    if (MouseRect.Intersects(TexturePosition.X,TexturePosition.Y,Texture.Width,Texture.Height)) //Mouse hovers over object[0] 
    return true; 
    else 
    return false; 
+1

Vous pourriez plutôt utiliser 'Rectangle.Contains (Point)', semble plus naturel. – neeKo

+0

Oui, j'ai oublié la surcharge de Point. – Cyral

2

Un Texture2D est seulement une représentation d'une image - il a seulement une grille 2D de texels. Il n'a pas de position sur l'écran, donc vous ne pouvez pas faire de vérification de la souris dessus.

Vous auriez besoin d'une classe contenant, comme un Sprite, qui contient à la fois la texture et une position. Vous pouvez ensuite ajouter une fonction hittest() à cette classe, ce qui permet de vérifier la position et la taille de la texture.

Ou mieux encore, trouvez une bibliothèque de sprites existante pour utiliser XNA. Je suis sûr qu'il existe quelques-uns qui vous donne cette fonctionnalité.

2

1. Créez vous ajoutez quelque chose de simple comme classe Button

Que diriez-vous ceci:

public delegate void ButtonEvent(Button sender); 

public class Button 
{ 
    public Vector2 Position { get; set; } 
    public int Width 
    { 
     get 
     { 
      return _texture.Width; 
     } 
    } 

    public int Height 
    { 
     get 
     { 
      return _texture.Height; 
     } 
    } 

    public bool IsMouseOver { get; private set; } 

    public event ButtonEvent OnClick; 
    public event ButtonEvent OnMouseEnter; 
    public event ButtonEvent OnMouseLeave; 

    Texture2D _texture; 
    MouseState _previousState; 

    public Button(Texture2D texture, Vector2 position) 
    { 
     _texture = texture; 
     this.Position = position; 
     _previousState = Mouse.GetState(); 
    } 

    public Button(Texture2D texture) : this(texture, Vector2.Zero) { } 

    public void Update(MouseState mouseState) 
    { 
     Rectangle buttonRect = new Rectangle((int)this.Position.X, (int)this.Position.Y, this.Width, this.Height); 
     Point mousePoint = new Point(mouseState.X, mouseState.Y); 
     Point previousPoint = new Point(_previousState.X, _previousState.Y); 

     this.IsMouseOver = false; 

     if (buttonRect.Contains(mousePoint)) 
     { 
      this.IsMouseOver = true; 

      if (!buttonRect.Contains(previousPoint)) 
       if (OnMouseEnter != null) 
        OnMouseEnter(this); 

      if (_previousState.LeftButton == ButtonState.Released && mouseState.LeftButton == ButtonState.Pressed) 
       if (OnClick != null) 
        OnClick(this); 
     } 
     else if (buttonRect.Contains(previousPoint)) 
     { 
      if (OnMouseLeave != null) 
       OnMouseLeave(this); 
     } 

     _previousState = mouseState; 
    } 

    public void Draw(SpriteBatch spriteBatch) 
    { 
     //spritebatch has to be started! (.Begin() already called) 
     spriteBatch.Draw(_texture, Position, Color.White); 
    } 
} 

2. Set it up

Pour l'utiliser, vous besoin d'une référence quelque part

Button _button; 

Dans votre LoadContent, vous pourriez faire quelque chose comme

button = new Button(Content.Load<Texture2D>("Textures\\Button"), new Vector2(100, 100)); 
button.OnClick += new ButtonEvent(button_OnClick); 
button.OnMouseEnter += new ButtonEvent(button_OnMouseEnter); 
button.OnMouseLeave += new ButtonEvent(button_OnMouseLeave); 

Dans votre Update vous appelez

button.Update(Mouse.GetState()); 

Dans votre Draw vous appelez

spriteBatch.Begin(); 
button.Draw(spriteBatch); 
spriteBatch.End(); 

3. Utilisez-le

Au lieu d'un bouton, utilisez un tableau de boutons (ou, si je peux recommander, un List<Button>), et puis juste boucle à travers la mise à jour et de les tirer tous de la même façon .

Ensuite, il est facile d'appeler du code personnalisé sur gestionnaires d'événements:

void button_OnClick(Button sender) 
{ 
    _gameState = GameStates.MainScreen; //or whatever else you might need 
} 

Vous pourriez même envisager de changer la texture si les survols de souris, ou utilisez un fondu élégant - les possibilités sont infinies, si vous peut les coder!