Followers 0

# Normalised Distance from a selected point

## 4 posts in this topic

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?

0

##### Share on other sites

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
0

##### Share on other sites

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).

0

##### Share on other sites

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!

0

##### Share on other sites

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
0

## Create an account

Register a new account