Sign in to follow this  
tmack8968

Getting X/Y of mouse ONLY inside rendered area

Recommended Posts

Hello,

 

I am using C#, first off. I have everything setup (very basic) for the Mouse inside of SlimDX (DirectInput).

 

I'm working a level editor for my basic 2D engine (this is just for fun, fyi), however, I ran into a problem (I might be approaching this incorrectly). I have a panel that I am rendering to. I need to get the mouse X/Y inside of the panel (or just the renderarea). What is the best way to approach this?

 

Are there any examples of using DirectInput in C#, that would help me out? I feel like I am totally doing this backwards dry.png

 

Thanks! 

Share this post


Link to post
Share on other sites

The .NET Panel class has a method named PointToClient that accepts a Point as input. The Point should be in screen coordinates (in your case; the mouse cursor position relative to the screen itself), the result is a Point that is relative to the Panel.

Share this post


Link to post
Share on other sites

You could use something like the following where you create some functions for your mouse inthe panel, then in your logic code you react to it:

 

 

 

private void panel_MouseLeave(object sender, EventArgs e)
    {
      trackMouse = false;
    }

private void panel_MouseEnter(object sender, EventArgs e)
{
  trackMouse = true;
}


if (trackMouse)
      {
        if (frameCount == 0)
        {
          if (mouse.X < Engine.TileWidth)
            position.X -= Engine.TileWidth;

          if (mouse.X > mapDisplay.Width - Engine.TileWidth)
            position.X += Engine.TileWidth;

          if (mouse.Y < Engine.TileHeight)
            position.Y -= Engine.TileHeight;

          if (mouse.Y > mapDisplay.Height - Engine.TileHeight)
            position.Y += Engine.TileHeight;

          camera.Position = position;
          camera.LockCamera();
        }

        position.X = mouse.X + camera.Position.X;
        position.Y = mouse.Y + camera.Position.Y;

        Point tile = Engine.VectorToCell(position);
        shadowPosition = new Vector2(tile.X, tile.Y);

        tbMapLocation.Text =
            "( " + tile.X.ToString() + ", " + tile.Y.ToString() + " )";

        if (isMouseDown)
        {
          if (rbDraw.Checked)
          {
            SetTiles(tile, (int)nudCurrentTile.Value, lbTileset.SelectedIndex);
          }

          if (rbErase.Checked)
          {
            SetTiles(tile, -1, -1);
          }
        }       
      }?

Share this post


Link to post
Share on other sites

Let's say your draw region is 100x100, and positioned from the topleft corner at 256x256. To get the mouse position in the box, you would just subtract the measure of the top-left corner from the mouse XY position to get a relative value. Then, you can use simple checks ( if newX < 0 || newX > 100, then mouse.X is not in the box's x bounds and therefore cannot be in the box, else check newY etc. etc.). That's all there is to it! Really. That's all.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this