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 ▽ | Embed ▽ | No License
1

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]