Trying to figure out why the player looks so jittery. I'm having the camera follow the player, and the ground below looks fine as the player moves, but the player itself is super jittery. In the embedded player here it looks fine, but while running in the designer, it's super jittery.
I found that if I move set_camera_world(x,y,z) to the end of _update() and remove it from _draw(), then the movement smooths out.
I'm guessing this issue is wrapped up in the fact that _draw() is being called every frame, rather than the way PICO-8 does it where it's being called 30 (or 60) times a second. That's just a total guess, though.
I spoke too soon. It seems super variable whether it jitters or not. On a reload of Voxatron, with no change in code, it started jittering. Reloaded Voxatron again and got no jitter. So, still not sure what's up. I still think it has to do with the timing of update and draw calls, but I'm not sure where to start debugging that.
I fixed this temporarily by re-writing the standard draw functions to make use of custom camera positioning variables, rather than relying on set_world_camera(). This is a total hack and is should only be used if you're running into the very specific problem I was having. Please don't consider this a good solution. It works, and that's all.
Put this in a script in your cart and call rewrite_draw_functions() from your _init() and then you can use set_camera(x,y,z) in your scripts instead of set_world_camera(x,y,z). (You can also use set_camera() of course to reset back to 0,0,0.)
--Standard draw functions re-written to fix --jitter from using set_world_camera(). To --use, run rewrite_draw_functions() in _init() function rewrite_draw_functions() set_camera() _vset=vset vset=__vset _vget=vget vget=__vget _box=box box=__box _boxfill=boxfill boxfill=__boxfill _line3d=line3d line3d=__line3d _sphere=sphere sphere=__sphere end function set_camera(x,y,z) if (not x and not y and not z) then _cx,_cy,_cz=0,0,0 else if (x) _cx=x if (y) _cy=y if (z) _cz=z end end function __vset(x,y,z,c) _vset(x-_cx,y-_cy,z-_cz,c) end function __vget(x,y,z) return _vget(x-_cx,y-_cy,z-_cz) end function __box(x1,y1,z1,x2,y2,z2,c) _box(x1-_cx,y1-_cy,z1-_cz,x2-_cx,y2-_cy,z2-_cz,c) end function __boxfill(x1,y1,z1,x2,y2,z2,c) _boxfill(x1-_cx,y1-_cy,z1-_cz,x2-_cx,y2-_cy,z2-_cz,c) end function __line3d(x1,y1,z1,x2,y2,z2,c) _line3d(x1-_cx,y1-_cy,z1-_cz,x2-_cx,y2-_cy,z2-_cz,c) end function __sphere(x,y,z,r,c) _sphere(x-_cx,y-_cy,z-_cz,r,c) end |
[Please log in to post a comment]