2
\$\begingroup\$

I want to move a game object from its current position to the mouse position, but my current code only ever moves in one of the eight ordinal directions. In other words, I want it to move along the red path, but I only know how to move it along the white path.

red line directly to target, white takes a detour

Here's my code:

while(cont){
    if(x1 > x){
        x++;
    }else if(x1 < x){
        x--;
    }
    if(y1 > y){
        y++;
    }else if(y1 < y){
        y--;
    }
    frame.repaint();
    sleep(); // Thread.sleep(200)
}
// x1 y1 - mouse position
// x, y - sprite position

What am I missing?

\$\endgroup\$
2
\$\begingroup\$

The white vector is the correct vector with the code you have. If you're only ever adding integers to your position, the movement is going to be at increments of 45 degrees. That's restricted to orthogonal and diagonal movement only. If you want free movement you should be normalizing the movement vector.

Check to see if the libraries you're using have a vector class with a normalization method, or create your own. Then you can move your sprite by the normalized vector:

Vector2 movementVec = (target-position).normalized();
\$\endgroup\$
  • \$\begingroup\$ Thanks! Ok maybe there are game engine that have a vector class with a normalization method? \$\endgroup\$ – user3334375 Sep 14 '14 at 15:02
  • \$\begingroup\$ @user3334375 to that effect, most game engines should have normalized vector capaabilities, but it shouldn't be that hard to do yourself using angles and possibly some equations such as the Pythagorean Theorem. \$\endgroup\$ – Pip Sep 14 '14 at 15:11
  • \$\begingroup\$ Also how my sprite will know that he should move by movementVec vector? \$\endgroup\$ – user3334375 Sep 14 '14 at 15:11
  • \$\begingroup\$ Yes I understand, but how can my sprite move by movementVec? I think that sprite movement represent x and y coordinates but what I need to do with movementVec? \$\endgroup\$ – user3334375 Sep 14 '14 at 15:14
  • \$\begingroup\$ Just like you've done in your code, you add the movement vector to the position of the sprite. So, for X for example, instead of ++ you'll use += movementVec.x. \$\endgroup\$ – MichaelHouse Sep 14 '14 at 15:27

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.