Take the 2-minute tour ×
Mathematics Stack Exchange is a question and answer site for people studying math at any level and professionals in related fields. It's 100% free, no registration required.

Okay, I struggled a bit choosing wheter to put this on StackOverflow or here, Math. I concluded that it was actual math my problem and not "exactly" programming.

You see, I am making a 2d game, top-view where your character moves around and you can use your mouse as aim to shoot.

My problem is that I can't figure out the correct formula to get the "amount of pixels to move per frame". Let me explain:

The projectile being shot will not "stop" at the point your mouse clicked. Instead it will continuously move. Every frame, my projectile is supposed to "change X-position by {pixels}" and "change Y-position by {pixels}". I don't know how to figure out the {pixels} amount I need for both X and Y movements.

Here is some code. It is quite self-explanatory:

class PortalBall
  def initialize(sx,sy,dx,dy)     # sx,sy source points. dx,dy destination points
    @speed = 60
    x_per_frame = dx / @speed
    y_per_frame = dy / @speed
  end
  def update
    @sprite.x += x_per_frame
    @sprite.y += y_per_frame
  end
end

As you can see, my formula to figure out the amount of x pixels to move per frame is "destination X divided by speed". Speed is always 60 actually...

But this clearly isn't working properly. Can someone help me fixing my formula?

NOTE In this language, the higher on the screen means less Y position and the lower screen is more Y position. The top of the screen is Y 0, and the bottom is Y 600.

share|improve this question
    
maybe you want to calculate the unit vector going into the direction of your bullet. Then every time step $t$ move $t$ times the unit vector. –  Listing May 4 '11 at 6:02
add comment

1 Answer

up vote 3 down vote accepted

First of all, whenever you have dx you actually want dx-sx and similarly for y. That's because you don't care about the absolute position of the destination, just the relative position of the source and the destination.

But your code is a little confused. Right now, if you increase @speed, the projectile moves slower. Also, if you increase the distance from the source to the destination, the projectile moves faster. I assume what you actually want is for the projectile to move at @speed regardless of the distance between the source and destination.

In that case, you want something like the following.

@speed = 60
dist = Sqrt[(dx-sx)^2+(dy-sy)^2]
x_per_frame = (dx-sx)/dist * @speed
y_per_frame = (dy-sy)/dist * @speed

(I'm not sure what square roots look like in your language.) The point of dividing by dist is to normalize the displacement vector so that it's a unit vector. You should probably also make some things floats as necessary to prevent rounding error.

share|improve this answer
    
Qiaochu: By "floats", maybe you meant "doubles" (i.e., double precision)? –  J. M. May 4 '11 at 1:52
1  
Sure. Whatever makes the gun not miss. –  Qiaochu Yuan May 4 '11 at 1:55
    
Hmm... there are some scenarios the square root line throws me an error because the value I am giving it is negative. What do I do I that case? Also yeah, I want the bullet's speed to be the same no matter the distance between the mouse and the character, but I'm not sure of that either. –  Omega May 6 '11 at 0:58
    
The value of $(dx-sx)^2 + (dy-sy)^2$ should never be negative. Are you sure you wrote that correctly? –  Qiaochu Yuan May 6 '11 at 1:23
    
sx = 438, sy = 298, dx = 256, dy = 227. The value is -253. The code line is dist = Math.sqrt(((dx-sx)^2)+((dy-sy)^2)) –  Omega May 6 '11 at 1:47
show 2 more comments

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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