• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# Normalised Distance from a selected point

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1Tweezy0126  Members

Posted 28 May 2014 - 05:50 PM

Hi, I'm working on a little 2D tank game in my free time and i'm having some issues getting my projectiles to function correctly.

I have my own little vector2D pointy vector class which I use for things like this (has an .x and .y). My container class works fine.

So, the code!

I have a vector which stored the current position of the player, this is basically around the center of the screen and is positioned in the middle of the sprite

currentPos.x = laserTexture.getSize().x / 2 + laserShape.getPosition().x;
currentPos.y = laserTexture.getSize().y / 2 + laserShape.getPosition().y;


Next, I have another vector which holds a left mouse click position

desiredPos.x = sf::Mouse::getPosition.x();
desiredPos.y = sf::Mouse::getPosition.y();


This stored the clicked location in an x and y.

Now, from this data I can do some vector maths and normalisation to find the distance between the current location and the desired location.

dirToDesiredPos = (desiredPos - currentPos);
float vectorLength = sqrt(dirToDesiredPos.x*dirToDesiredPos.x + dirToDesiredPos.y*dirToDesiredPos.y);

dx = dirToDesiredPos.x / vectorLength;
dy = dirToDesiredPos.y / vectorLength;

//Then, I push the laserShape onto a laser vector;

laser.push_back(laserShape);


All of this calculation is done in a controls function which only gets called when the player clicks the left mouse button.

Next, in my update function I call dx and dy and then move the laserShape;

for(it=laser.begin(); it!=laser.end(); ++it)
{
it->move(dx, dy);
}



The issue is, when I click close to the tank the firing is completely off, and when I click further out of the window the position of the laser still doesn't meet the desired location, see img

Can you guys see anything i'm missing here?

### #2DiegoSLTS  Members

Posted 28 May 2014 - 06:15 PM

It looks like the y coordinate is inverted, maybe check if you're adding or substracting the dy correctly? That's a common issue when drawing on the screen.

Another issue could be that you're drawing your images with the upper left corner in the objects position instead of the center of the image in the objects position. If you're drawing the images at (objectsPosition.x, objectsPosition.y) try drawing them at (objectsPosition.x - objectsWidth/2, objectsPosition.y - objectsHeight/2) instead.

dx and dy are ints or floats? If they're ints maybe you have some problems with rounding too, which will accumulate if you move with an error a lot of times in the for loop.

Also, as a suggestion, you'll have less problems if you create functions for some calculations. Normalizing a vector is a task you can use for lots of things, and it's much easier to test if it's an independant function. It's usefull also to discard possible bug sources when you don't know what's hapenning.

EDIT: Another suggestion, try the same drawing only points instead of images for the tank and the laser so you can quickly identify is the bug is related of the drawing or the math used.

Edited by DiegoSLTS, 28 May 2014 - 06:18 PM.

### #3phil_t  Members

Posted 28 May 2014 - 06:17 PM

You're making the assumption that the mouse is in the same coordinate space as your game. Is that correct? From your image it looks like your Y is inverted (implying maybe that the positive Y axis points up in your game).

### #4Tweezy0126  Members

Posted 29 May 2014 - 02:57 AM

From both replies you have both states that it looks like the Y is inverted, I shall double check my calculations and get back to you! Also, this will be made into a function, I just want to test that my base math works, then i'll make it all fancy

Using floats for everything.

Thanks for the tip about drawing points instead of images so I can quickly identify what is going wrong!

### #5Tweezy0126  Members

Posted 29 May 2014 - 10:37 AM

Double checked the positions, they aren't being inverted. The only thing that springs to mind is that the positions i'm using are somewhat off. I'll mess around with SFML and see what I get.

-- Fixed my issue. For the mouse position it was returning the variable relative to the desktop, whereas I needed it relative to the game window, so making this little change fixed it

Edited by Tweezy0126, 29 May 2014 - 10:40 AM.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.