So I'm relatively new to coding, so I thought Pico-8 would be good to fiddle around with.
So after playing a few games and messing with a few of the demo's code, I found a problem.
Sometimes, in the bounce demo which I modified, when you bounce the velocity y of the ball
would suddenly stay at 0 mid-air. I don't know why can anyone help?
-- bouncy ball demo
-- by zep
-- modified by help_plz
size = 10
ballx = 64
bally = 80
floor_y = 100
bounce_per_sec = 0
-- starting velocity
velx =0
vely =0
frame=0
lag=0
offset=3
bounce=false
collision=false
function _draw()
cls(1)
map(0,0,0,100,16,1)
print("press ❎ to bump",
32,10, 6)
--rectfill(0,floor_y,2227,127,8)
--circfill(ballx,bally,size,clr)
if vely < 5.5 and vely > -4 then
lag=vely
end
spr(1,ballx-offset-velx,
bally-4-lag)
spr(17,ballx-10,bally-10,2.75,2.75)
print("x:"..ballx, 20,26)
print("y:"..bally, 20,32)
print("b_p/s"..bounce_per_sec, 20,38)
print("vx:"..velx, 20,44)
print("vy:"..vely, 20,50)
print("col:"..(collision and 'true' or 'false'),20,56)
--print("cx:"..camerax, 20+ballx,56,1)
--print("cy:"..cameray, 20+ballx,62)
end
function _update60()
offset=4
collision=false
if bally < 0 then
cameray=flr(bally)-64-flr(vely)
end
if bally > 10 then
cameray=0
end
camera(camerax, cameray)
frame+=1
if frame==60 then
bounce_per_sec = 0
end
if frame==60 then
frame = 0
end
if ballx+velx < 0+size or
ballx+velx > 128-size
then
-- bounce on side!
sfx(1)
velx *= -0.8
else
ballx += velx
end
--==================--
-- move ball up/down
if bally+vely >= floor_y-size
then
-- bounce on floor
bounce_per_sec+=1
vely = vely * -0.8
collision = true
sfx(0)
else
bally += vely
end
--so the ball doesn't bounce forever, and instead stops
if bounce_per_sec >= 5.5 then
vely = 0
end
-- gravity
if vely > 0 or vely < 0 then
vely += 0.2
end
--====================--
if btn(0) then
offset=8
end
if btn(1) then
offset=-1
end
if (btnp(5)) then
vely = 5
sfx(2)
if btn(0) then
velx=-4
end
if btn(1) then
velx=4
end
end
end
|
Your problem is around here
--so the ball doesn't bounce forever, and instead stops if bounce_per_sec >= 5.5 then vely = 0 end -- gravity if vely > 0 or vely < 0 then vely += 0.2 end |
Your gravity check misses out 0, so if vely is 0 gravity is not applied. So I'd guess you want to check for a while number in bounces_per_sec instead of a decimal since it does look like in that gif the ball does bounce five and a half times before stopping.
When I do gravity I use an 'on_ground' Boolean to control if gravity is applied or not, I would recommend doing that instead of 0 having odd behaviour
So yeah I'd have something like
- apply gravity only if on_ground is false.
- start with on_ground as true, then when the bouncing starts set it to false
- have some kind of 'bounces_till_stop' variable and every time the ball hits the ground reduce it by 1
- when the ball hits the ground and 'bounces_till_stop' is 0, set on_ground to true again.
It'll need a little tweaking but something like that. You probably want some terminal velocity as well.
[Please log in to post a comment]



