Math for projectile relative to speed and angle

Get help using Construct 2

Post » Sun Mar 11, 2012 1:56 am

I'm having trouble working out the math for my 2d asteroids-style shooter. In particular when the player is firing a projectile from an angle different than their current angle of movement. This image will hopefully describe the issue clearly:



The actual ship is using Physics for it's movement.

The player's speed is determined using this formula:

sqrt(player_ship.Physics.VelocityX ^ 2 + player_ship.Physics.VelocityY ^ 2)
B
20
S
5
G
3
Posts: 65
Reputation: 3,764

Post » Sun Mar 11, 2012 8:14 am

you can use
distance(0,0,player_ship.Physics.VelocityX,player_ship.Physics.VelocityY)
it's the same (well ok there's no much gain in term of place on that one)

For your bullet if it's a bullet behavior you have to give the angle of movement and the speed if I remember so it would be
angle of the object = angle of the ship
bullet.movingangle = angle(vector Velocity of the bullet + vector velocity of the ship)
bullet.speed = magnitude(vector Velocity of the bullet + vector Velocity of the ship)
In short you have to add the two vector and then retrieve the angle and speed of the solution

To add the two vector do it this way :
[code]Global number bulletSpeed = 500 //put what you want
+On shot
Local number bVx = 0 //bullet X component of default velocity vector
Local number bVy = 0 //bullet Y component of default velocity vector
Local number sVx = 0 //ship X component of velocity vector
Local number sVy = 0 //ship Y component of velocity vector
Local number rVx = 0 //result X component of velocity vector
Local number rVy = 0 //result Y component of velocity vector
player_ship: Spawn projectile
System: set bVx to cos(player_ship.angle)*bulletSpeed
System: set bVy to sin(player_ship.angle)*bulletSpeed
System: set sVx to player_ship.Physics.VelocityX
System: set sVy to player_ship.Physics.VelocityY
System: set rVx to bVx + sVx
System: set rVy to bVx + sVy
Projectile: set angle to player_ship.angle
// if your bullet is just a physic object you can set it's velocity X and Y to rVx and rVy... For bullet behavior you need two more steps
Projectile: Bullet set moving Angle to angle(0,0,rVx,rVy)
Projectile: Bullet set speed to distance(0,0,rVx,rVy)[/code]

Tell me if it worked, not sure.




Yann2012-03-11 08:24:59
B
60
S
22
G
14
Posts: 1,479
Reputation: 16,346

Post » Sun Mar 11, 2012 2:40 pm

Yann,

Thank you so much for the help. Unfortunately it's still not behaving exactly the way I need it to. This only seems to work if the ship's angle is the same angle as it's velocity (in other words it's facing it's current direction of movement). But if the ship is facing a direction that is different than it's angle of movement the projectile doesn't behave properly.

Imagine if you were driving a car in space (or a vacuum with no resistance) and you throw a tennis ball out of the side window. The tennis ball should move away from the car (at a 90 degree angle) but it also has the forward momentum of the car and no wind resistance. So while the ball is moving away from the side of the car it will also be moving in the same direction as the car. From the observer in the car it would look the same as if the car was stationary and he threw the tennis ball.

That's the effect I want when the ship is moving in one direction, rotates his ship (but not changing his angle of movement) and fires a shot. The shot should move relative to velocity of the ship and away from whatever angle the ship is currently facing.

Thanks again. Hope this helps explain what I'm looking for.
B
20
S
5
G
3
Posts: 65
Reputation: 3,764

Post » Sun Mar 11, 2012 4:49 pm

I don't understand your problem
seems pretty fine here
shipShooter.capx



here I made the ship volontarily shot at 90 degree to test the "bullet should follow the ship"
And even if you have the weird impression it goes sideway, if you think horizontally it follow the ship quite well.
ship90degreeShooter.capx

The impression you have that the bullet doesn't follow, might be caused by the fact that you are accelerating. Your bullet just get the instant velocity the moment you shoot. You can see that in the second capx, when you attain maxSpeed, bullets follow the ship. But when you change direction and your velocity is not constant anymore, the bullet doesn't follow anymore.
That's an expected behavior
Last edited by Yann on Sun Sep 14, 2014 9:24 pm, edited 1 time in total.
B
60
S
22
G
14
Posts: 1,479
Reputation: 16,346

Post » Sun Mar 11, 2012 6:29 pm

@Yann
The "set angle of motion" action wasn't having any effect in your example for some reason, but if you set the angle to "angle(0,0,rVx,rVy)" then it works as expected.

Using FF 10.0.2
B
79
S
24
G
53
Posts: 4,728
Reputation: 40,219

Post » Sun Mar 11, 2012 7:05 pm

@R0J0hound
That's weird I can't see any difference. Using FF or Chrome.
B
60
S
22
G
14
Posts: 1,479
Reputation: 16,346

Post » Sun Mar 11, 2012 7:47 pm

@R0J0hound

I tried that and now I am getting the proper movement for the missile. But it causes a new problem. The missile is facing the direction that it's actually going, but I want it to always point away from the front of the ship, even though it's "global" movement may not be in that direction. I updated Yann's example and it shows pretty clearly what the issue is.

http://dl.dropbox.com/u/28484936/ship_shooter.capx
B
20
S
5
G
3
Posts: 65
Reputation: 3,764

Post » Mon Mar 12, 2012 4:49 am

@Yann
I found the cause was a bug: http://www.scirra.com/forum/topic49991_post314880.html#314880
Are you certain it's working for you? The test I used was get the ship moving in a direction then turn the ship 90 degrees and shoot. The bullets should move with the ship.
Your 2nd capx works because the angle is 0, which is the only case where the bug doesn't appear.

@robit_studios
I found that Yann's original example wasn't working quite right due to a bug with the bullet behavior. But I imagine it will be fixed quickly and then Yann's sterling example should work as intended.

A workaround solution is to not use the bullet behavior at all but use variables for x and y velocities, then move with events:
http://dl.dropbox.com/u/5426011/fixed/space%20shoot.capx
B
79
S
24
G
53
Posts: 4,728
Reputation: 40,219

Post » Mon Mar 12, 2012 4:56 am

There a simple solution to that robit. Make the bullet invisible and make another sprite follow it at the proper angle (:
B
60
S
22
G
14
Posts: 1,479
Reputation: 16,346

Post » Mon Mar 12, 2012 5:06 am

@R0J0hound
Oh! Seeing your fix, I see how wrong the movement was now. And not using bullet for now will probably be simpler than a sprite following another sprite as I just suggested.
B
60
S
22
G
14
Posts: 1,479
Reputation: 16,346

Next

Return to How do I....?

Who is online

Users browsing this forum: makotto, randomly, Walessio and 25 guests