Log In

I am working on a little shooter where players can move up and down a fixed track, and can aim a cannon to shoot a projectile at an angle. Ideally, this angle can run parallel to the track, but shouldn't intersect it.

I thought I had the math down, but I am running into an issue where the players' projectiles are able to intersect the track. It appears that, even though I constrain the angles that player cannons can point and fire, players seem to be able to extend and shoot a tiny bit beyond it. Strangely, a simple debug test that prints the angles indicates that they should be parallel to the track in these situations.

Angle constraint formulas:

 ```--player 1 is on the left side, and aims right if p1.a<270 and p1.a>100 then p1.a=270 end if p1.a>90 and p1.a<270 then p1.a=90 end --player 2 is on the right side, and aims left if p2.a<90 then p2.a=90 end if p2.a>270 then p2.a=270 end```

Cannon aiming formulas:

 ``` if btn(⬅️, p.c) then p.a+=target_speed p.tx=p.x+radius*cos(p.a/360) p.ty=p.y+radius*sin(p.a/360) if p.a>360 then p.a=0 end end if btn(➡️, p.c) then p.a-=target_speed p.tx=p.x+radius*cos(p.a/360) p.ty=p.y+radius*sin(p.a/360) if p.a<0 then p.a=360 end end```

Have I found a bug with how PICO-8 does its circle math? Or have I erred somewhere? (It's probably the latter, but I can't see what I'm doing wrong.)

Cart #ponezabaka-0 | 2022-09-02 | Code ▽ | No License
1

Well, PICO-8 does angles as a percentage of 1, so you can still use the calculation functions as long as you express things as a percentage (which I do – all my trig functions use p.a/360). I don't think that's the root of the problem? But I could be wrong.

1

The tank positions (`p.tx`, `p.ty`) are not updated after the angle constraint! Therefore, in `_draw()` and `add_bullet(source)`, `p.tx` and `p.ty` are still not constrained, and can go behind player.

 ```if p1.a<270 and p1.a>100 then p1.a=270 end if p1.a>90 and p1.a<270 then p1.a=90 end -- update the tank positions! p1.tx=p1.x+radius*cos(p1.a/360) p1.ty=p1.y+radius*sin(p1.a/360)```

Also, there is another problem with the current approach: when you hold left and press "x" to shoot bullet, due to the order of the program flow, the constraint will not be applied when calling `add_bullet()` and can go behind player. You need to apply the constraint after "left/right" button processing but before "x" button processing.

 ```if btn(right, p.c) then ... end -- Maybe do angle constraint here. if btn(x. p.c) then add_bullet() end```

Good luck!

Oh, this is a great fix! Thank you, bob1996w. You've helped me over a big hurdle.

And thank you, merwok, for your help! I appreciate you reaching out to assist.

[Please log in to post a comment]