Skip to main content
GameDev.net gamedev.net
🔒 Locked

Getting X/Y of mouse ONLY inside rendered area

Started by tmack8968 Feb 21, 2013 at 11:26 AM 4 replies 1.9k views
Original Post
tmack8968
tmack8968

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!

btower
btower

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.

LordRhys
LordRhys

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

MisterFuzzy
MisterFuzzy

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  
cozzie
cozzie
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
unbird
unbird

Simply grab the MouseMove event of said Panel ?

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.