Jump to content

  • Log In with Google      Sign In   
  • Create Account

We're offering banner ads on our site from just $5!

1. Details HERE. 2. GDNet+ Subscriptions HERE. 3. Ad upload HERE.

Don't forget to read Tuesday's email newsletter for your chance to win a free copy of Construct 2!

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.

  • You cannot reply to this topic
4 replies to this topic

#1 Tweezy0126   Members   -  Reputation: 103


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;


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?


#2 DiegoSLTS   Members   -  Reputation: 1751


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.

#3 phil_t   Crossbones+   -  Reputation: 3948


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

#4 Tweezy0126   Members   -  Reputation: 103


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!

#5 Tweezy0126   Members   -  Reputation: 103


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.