Getting X/Y of mouse ONLY inside rendered area

Started by
4 comments, last by unbird 11 years, 1 month ago

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!

Advertisement

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.

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);
}
}
}?

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.

"Only idiots quote themselves" - MisterFuzzy

You might achieve this by creating your directinput object with the "discl_foreground" parameter (instead of background). Assuming i understand your question correct.

Crealysm game & engine development: http://www.crealysm.com

Looking for a passionate, disciplined and structured producer? PM me

Simply grab the MouseMove event of said Panel ?

This topic is closed to new replies.

Advertisement