Somehow I cannot wrap my head around this 2d vector.
var normal_speed := 600.0
var max_speed := normal_speed
var direction := Vector2.ZERO
var drag_factor := 0.01
var desired_velocity := Vector2.ZERO
var steering_vector := Vector2.ZERO
var velocity := Vector2.ZERO
desired_velocity = max_speed * direction
steering_vector = desired_velocity - velocity
velocity += steering_vector * drag_factor
If I say steering_vector * drag factor is the velocity. To change position I use velocity and the delta for the constant performance. If I use an input for example W to go up I start at Vector2.Zero and move direction.y - with a speed of 600.0 pixels per frame. Multiplying this by 0.1 every frame will reduce my steering vector (which seems to be directly affecting my velocity) from 600 - 60 = 540 then my new velocity is 540 (I should move slower), if I continue each frame will my velocity not just hit 0 and therefore I should not move? I am surely missing something because this is not how it behaves but maybe someone can explain this to me so a simpleton like me can understand it (maths is not yet my strong-suit, got lots of catching up to do!)
var normal_speed := 600.0
var max_speed := normal_speed
var direction := Vector2.ZERO
var drag_factor := 0.01
var desired_velocity := Vector2.ZERO
var steering_vector := Vector2.ZERO
var velocity := Vector2.ZERO
desired_velocity = max_speed * direction
steering_vector = desired_velocity - velocity
velocity += steering_vector * drag_factor
var drag_factor := 0.01
Your drag_factor is 1% not 10%.
if direction is W, Vector2.UP = Vector2(0.0, -1.0)
if your ship don't move in start, velocity = Vector(0.0, 0.0)
desired_velocity = 600.0 * (0.0, -1.0) = (0.0, -600.0)
steering_vector = (0.0, -600.0) - (0.0, 0.0) = (0.0, -600.0)
velocity += (0.0, 0.0) + (0.0, -600.0) * 0.01 = (0.0, -6.0)
position += velocity * delta
if position start (0.0, 0.0)
position += (0.0, 0.0) + (0.0, -6.0) * delta(very small number, imagine 0.016667) = (0.0, -0,100002) at frame 1
Now, imagine that you are at maximum speed towards UP and that you now press RIGHT.
And your position is (0.0, -1000.0)
desired_velocity = 600.0 * (1.0, 0.0) = (600.0, 0.0)
steering_vector = (600.0, 0.0) - (0.0, -600.0) = (600.0, 600.0)
velocity += (0.0, -600.0) + (600.0, 600.0) * 0.01 = (6, -594.0)
position += (0.0, -1000.0) + (6, -594.0) * 0.016667 = (0.100002, -1009.9) next frame
Now if you raise all the keys, since you have a drag_fator = 0.01, it will take several seconds, rather several tens of seconds, for the ship to come to rest.
And even if visually you see it as stationary, the velocity Vector2 can be a (0.0, 0.00001256) then (0.0, 0.00001249) etc.
if I continue each frame will my velocity not just hit 0 and therefore I should not move?
Yes, after a while, the ship should stop moving with the code you provided. But as godoterfr pointed out, it will take several seconds for the ship to stop. Especially with a drag factor as low as 0.01, the change in velocity is very slow. So your ship is accelerating and slowing down, but the change takes a very long time and is hard to see.
Try increasing the value to 0.15, you'll see a big difference.
Thanks godoterfr for helping, as always!
Thanks for the info, I don't think I fully understand but I believe I know why my initial thinking was wrong. I believed that the velocity value that we subtract from the desired_speed in the steering_vector variable would be additive so after some frames I thought I should not be moving even when I add input.
Visualizing the values as vectors (0,0)(0,0) is also great, thanks again for the answer.
Hi, I believe I understood it now...
I start off with a desired velocity but rather than moving instantly to the desired velocity I use velocity in the position = velocity * delta. That means my velocity at frame 1 is steering factor * drag factor which is essentially whatever the desired velocity is * drag factor. In my case (yes correct 1%, I forgot to change the code when pasting) 600 * 0.01 = 6. At frame1 I move at a speed of 6 rather than 600 and gradually add more to velocity with the same equation (less every frame due to the steering vector calculation) every frame until I hit desired speed at which desired speed - velocity == 0 meaning the steering factor * drag force == 0 which means I am not changing my velocity until I change my input again which adds a potential new vector point that I gradually move towards...
I hope I understood this now and if so I have no clue why it took me this long and thanks to the answers they helped.
Maybe because this is the 1st practice and we're only making small edits to tie the game all together, but why have normal_speed and max_speed since we assign max_speed to the value of normal_speed? Boost speed is different from max_speed too so it must be building blocks for later exercises? In this specific activity, could we have just used a general speed variable?
ookpeery in this lesson, we change the value of max_speed.
The variables normal_speed and boost_speed could be named respectively normal_max_speed and boost_max_speed for clarity: they're two values between which max_speed alternates in the code.
We use variables to represent them just to put a label on the respective maximum speed values: 600 and 1500 pixels per second, respectively.
As for just having one variable representing the maximum speed, I think this is what we have already, as the normal and boost speeds are basically constants. However, as we haven't introduced the const keyword yet, we use variables instead.