I have truly lost count of the number of times I have made more or less this exact same game.
There is a reason I start with JetLag. When done correctly, it has all of the components of a much more sophisticated game in miniature.
I admit, the graphics are rudimentary. I use filled rectangles and text. These things are not earth shattering. The point here is that this game draws onto the screen, and to quote Andre LaMothe: “if you can draw a pixel, you can make a game.”
It’s not quite true, about the pixel I mean. It is true that being able to draw a pixel gets you halfway to making a game. The other half is being able to get input from a player. However, once you have the ability to draw something on the screen and the ability to get any sort of input from the user, it makes game creation possible.
In JetLag, the controls are keyboard only, although I am considering supporting the gamepad as well.
Not all games require this, but enough of them do such that it may as well be a required thing. In JetLag, the love.update function hands me a time delta, from which I can calculate when to scroll the display.
JetLag can be enjoyed on mute. The music is merely there for ambiance. I’ve got some mixed feelings about game music.
When I am playing a game on my desktop computer, I may leave the music on, but this is for games like Minecraft or Yonder, where a great deal of thought has been put into the music for the game.
When I am playing a game on my phone, I immediately look to turn off the music and sound effects. Why? because I want to be able to play the game when I’m “indisposed”, and it making noise is the last thing I want.
So I require of myself when adding music and/or sound effects that I provide a means by which it may be conveniently turned off.
Also, I’m not a composer, so while I do try to select music appropriate to the game, I’m not engineering an immersive experience here. I’m tacking on music because tacking on music is the thing to do.
Sound effects I pull from sfxr/bfxr/some other sound effect generator. I’m not engineering realistic sounds.
Same deal applies for sound effects as does music. I want it there, but I want to be able to turn it off.
And that brings me to persisted preferences. During a play session, if I turn off the audio, the next time I play, it better stay off!
So I save my preferences to disk somewhere. Love2D has a nice set of functions for saving and loading little files, and I found a usable json library for lua that suits my needs.
I also store the high score achieved in the game, just to add a little self-competition.
JetLag has exactly two game states: game over and play, but it still qualifies as a state machine, and is a shadow of the more formalized state machines that I’ll wind up developing later.
The internal state of JetLag might look like it is a grid. It is not, because it doesn’t need to be. The renderable state is two arrays: one for block locations and one for tail locations. In fact, the only really important block/tail location is the head.