crankstart icon indicating copy to clipboard operation
crankstart copied to clipboard

Fix drawing order of sprites and other graphics

Open Ruin0x11 opened this issue 1 year ago • 2 comments

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: 1

After: 2

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.

Ruin0x11 avatar Aug 25 '23 22:08 Ruin0x11

Awesome find, thanks! Is it breaking change for other users? 🤔

boozook avatar Sep 03 '23 17:09 boozook

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

lyonbeckers avatar Sep 09 '23 19:09 lyonbeckers