2017-07-23 4 views
0

J'ai une grille de tuiles, et je veux être en mesure de saisir une zone comme ceci: enter image description herePrenez la première et le dernier point de glisser la souris dans XNA/monogame

Voici mon code actuel:

case clickState.select: 

    if (IsActive && //Check if window is active and mouse is within working area 
     Mouse.GetState().X > 0 && 
     Mouse.GetState().X < windowSize.X - 32 && 
     Mouse.GetState().Y > 0 && 
     Mouse.GetState().Y < windowSize.Y - 32) 
    { 
     if (Mouse.GetState().LeftButton != ButtonState.Pressed && prevMouseState)//if has released, and last frame it wasnt: 
     { 
      Vector2 Topos = toTilePos(new Vector2(Mouse.GetState().X, Mouse.GetState().Y)); //convert the onscreen postion to coordinates on the grid 
      selected.Z = Topos.X; //yes i am using a vector4 to store 2 vector2s 
      selected.W = Topos.Y; //Z =x2, W = y2 
      break; 
     } 
     if (Mouse.GetState().LeftButton == ButtonState.Pressed && !prevMouseState) //If started to click: 
     { 
      if (selected != new Vector4(0)) selected = new Vector4(0); //Reset selected area 
      prevMouseState = true; //The previouse state will be updated 
      Vector2 Topos = toTilePos(new Vector2(Mouse.GetState().X, Mouse.GetState().Y)); //convert to tile space 
      selected.X = Topos.X; // set 
      selected.Y = Topos.Y; // set 
      break; 
     } 
    } 
    else if (prevMouseState == true) 
     prevMouseState = false; 
    break; 

À l'heure actuelle, il ne fait que pépins et ... agit bizarrement .. Il est assez difficile à expliquer, parfois il sélectionne, d'autres, il sélectionne la mauvaise zone. Toute aide est appréciée!

Répondre

0

J'ai essayé de créer la logique que j'ai écrit d'innombrables fois avant:

MouseState mouseState = Mouse.GetState(); 
if (mouseState.LeftButton == ButtonState.Pressed) 
{ 
    end = new Vector2(mouseState.X, mouseState.Y); 

    if (prevMouseState.LeftButton == ButtonState.Released) 
    { 
     start = end; 
     selecting = true; 
    } 
} 
else 
    selecting = false; 

prevMouseState = mouseState; 

Ceci est ma mise à jour logique pour obtenir les deux points (dans mon cas deux Vector2 appelé start et end) et une variable qui indique si je traîne actuellement.

J'ai essayé d'optimiser le mieux que je pouvais:

Je reçois un emplacement sur chaque mise à jour appel aussi longtemps que je presse Mouse1. Lorsque j'appuie sur Mouse1 pour la première fois, j'affecte l'emplacement nouvellement créé à l'emplacement de départ et le conserve (dans votre cas, un Vector4). selecting peut être n'importe quoi, d'un booléen à un événement qui se déclenche. C'est juste un exemple et peut être étendu.

Je garde une référence à la dernière information que j'ai reçue de la souris et je la mets à jour au bas de mon code.

Il m'empêche également d'appeler Mouse.GetState() plus d'une fois.

Bonne chance.

+0

Merci d'avoir répondu! J'avais déjà corrigé mon code avant que tu l'aies posté, mais le mien est l'équivalent du tien. J'ai trouvé que l'erreur était principalement dans le code qui convertit 2 vector2s en un rectangle. https://stackoverflow.com/a/45259788/8050514 –