Congratulations! This is an interesting and fun game. I think it adds some unique variations on previous similar games.
After reading your blog entry about it, I’d like to point out that 60 frames per second is not the maximum you can use for setFrameRate() / nextFrame(). Since the frame rate you specify is translated into integer milliseconds (1000 / framerate), the maximum theoretical rate is 1000. In practice, it will be quite a bit lower, being limited by the time it takes to do whatever calculations and rendering are required for a frame, plus the time to write the screen buffer to the display itself if you use display() for each frame.
For you, and any other developers reading this, there are a couple of tools provided by the Arduboy2 library that you can use to determine if you’re rendering fast enough to keep up with your chosen frame rate.
The first is function cpuLoad(). Calling this will return the percentage of time that you spent doing work in the last frame (i.e. the time not idling waiting for nextFrame() to return true). If the value returned is less than 100, then your code is not exceeding the time allowed and you can use the value to get a rough idea of how much extra time is available. If it’s greater than 100, then your code is taking more than one frame period and you’ll actually be running slower than desired.
During development, you can call cpuLoad() and report the returned value in some way, such as by putting it somewhere on the screen after rendering the game content.
Keep in mind though, that the act of calling cpuLoad() and reporting its value will take a bit of additional time itself, which will be included in the reported value, so the actual percentage will be a bit lower in the final game without the additional cpuLoad() calls and reports.
If you just want to know if your rendering time is exceeding the chosen frame rate, you can use nextFrameDEV(). This works exactly the same as nextFrame() but additionally will light the yellow TX LED at the bottom left of the Arduboy whenever the allotted frame time is exceeded. You use this function by replacing all calls to nextFrame() with nextFrameDEV(). Then, if you see the TX LED come on any time while playing your game, you know your rendering has taken too long.
You should remember to change all your nextFrameDEV() calls back to nextFrame() before releasing the game, as nextFrameDEV() takes up a small amount of extra program space and CPU time.
Also note that if your game uses the USB port to communicate with another device for some purpose, the TX LED will flash during communication, which does not indicate excessive CPU load.