crankstart
crankstart copied to clipboard
Fix drawing order of sprites and other graphics
I'm not sure why but playdate->sprite->updateAndDrawSprites(void)
in the C API seems to clear the screen before drawing anything. So a game that allocates any sprites through the SpriteManager
will be unable to draw things in the Game::update()
method anymore because that method is called before sprite updates within crankshaft
(even if the sprites are never added to the manager).
To fix this, I swapped the order of update_and_draw_sprites()
and Game::update()
in crankshaft
's update method. I tested the linked nine_lives
repo before and after this change.
Before:
After:
I also had to remove the call to Graphics.clear()
in the update method for it to work correctly.
As for how to draw behind sprites given this change, from what I understand the Lua API provides a method that allocates a "background sprite" and allows you to specify how it should be rendered. But there isn't an equivalent function in the C API, and there's nothing mentioning this screen clearing behavior in either the Lua or C API documentation. I'm assuming that drawing things behind sprites with the core graphics API is unsupported for some reason, and this method would have to be reimplemented in crankshaft
.
Awesome find, thanks! Is it breaking change for other users? 🤔
I think my only reservation would be that any game logic that should update a sprite won't be applied until the next frame. So if input is handled in Game::update, the sprite wouldn't move until the next frame. That might feel noticeably unresponsive at 20 fps, but I haven't tried it yet