简体   繁体   中英

Moving an object from one point to another

I'm trying to get an object to move from one point to a different one in a straight line. I tried something similar a while back, but it moved until it was aligned with the axis. That code looked like this:

if(x < otherObject.x) x++;
else if(x > otherObject.x) x--;

if(y < otherObject.y) y++;
else if(y > otherObject.y) y--;

This is a highly inefficient system, and I have been looking at other ways to go about this.

But I also have to move at a specific speed which is what I have been struggling to solve. Example of coordinate movement:

-50,200 => 50,-100
300, 300 => 600,230

The goal is to get it to move in a straight line from point A to B, but it should move at an even speed. Considering this:

例子

The goal is to get it to move through the line, and the speed should make it stay on the line(some inaccuracy is acceptable, but it aligning to the X/Y axis(meaning targetX/targetY is equal to currentX/currentY should not happen).

Any ideas?

First of all, you need to forget the concept of movement from a given "source" point to a given "target" point.

Instead, think of your object at any given moment as being at a current point, and moving in a certain direction with a certain speed .

You will need a real number to hold the angle (in radians) representing the direction your object is moving. If your object needs to go from source position (sx,sy) to target position (tx,ty) then the angle is computed as follows:

float deltaX = tx - sx;
float deltaY = ty - sy;
float angle = Math.atan2( deltaY, deltaX );

You will also need a real number to hold the speed at which your object is traveling. Ideally your speed should be expressed in terms of screen units (pixels?) per second, but let's keep things simple and just let speed be expressed in terms of screen units per frame. "Frame" simply means "whenever you get around to calculating stuff and rendering stuff". You may be doing this as fast as you can, or you may be doing it 30 times per second, the choice is yours.

So, given all of the above parameters, to calculate your object's new position at each frame, use the following:

currentX += speed * Math.cos( angle );
currentY += speed * Math.sin( angle );

To find out whether your object has reached the "target" point, compute the distance between your object and the "target" point, and if it is small enough, consider it "there". Do not expect the current point of your object to ever become equal to the target point, that would require too much precision.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM