Planning the user flow
Today I did some thinking about the user flow through the game.
This was supposed to be a live stream in this YouTube account, but it didn't work out. I spent an hour talking to myself in front of a camera, all of which went to /dev/null accidentally, and now I'll attempt to capture some of those ideas here for posterity.
The goal
The ultimate goal is to create a game for Apple platforms using only technologies provided by Apple. So, a game for iPhones/iPads/Macs/Apple TVs, written in Swift, and using SpriteKit and GameKit (among other *kits).
The goal for today specifically was to decide on the scope and map out the screens I'll need to implement.
The v1 scope
This is what I came up with during the failed live stream:
While I am, of course, very proud of this - as a visual piece of art - I suppose it might require some clarification to others.
I ended up deciding to do three separate flows:
- local games
- online games
- training mode
Initial scene
There is an initial screen before the main menu. The point of this is to perform some basic setup, which will be useful later.
Most importantly, this is where we sign into GameKit. If GameKit is not available, we want to know this, so we can disable any online game modes later. We still want to allow local games, even if GameKit is disabled, though.
Following GameKit sign-in, we want to - on Apple TV - wait for a game controller to be connected. I don't want to support the TV remote, so if there's no extended game controller available, we will stay stuck on this screen.
And there is another reason to have this separate screen, even on non-TV platforms. If there are multiple game controllers connected, we want to identify the one, which belongs to the main player. I.e. the controller, which will be responsible for handling the UI. So we will wait here until a button is pressed on a controller, at which point this controller will be marked as the P1 controller.
Local games
After passing the initial screen - ensuring we are signed into GameKit and have a connected controller - we arrive on the menu. The first option will be the local match.
This is the game's raison d'être game mode. Ultimately, I want to sit on the couch, in front of my Apple TV, and be able to play local co-op with my kids. So everything will revolve around this game mode.
I went back and forth a bit trying to figure out how exactly to present this flow, and ultimately settled on directly going to a lobby screen.
The lobby screen will allow choosing three settings:
- the game's difficulty
- the game mode (e.g. random level, race to the top, survival, etc.)
- the number of matches (e.g. single game, or an 18-match cup, etc.)
Finally, players can mark themselves as ready or not. When everybody is ready, we will progress to the actual game scene.
Up to 3 players can join locally by pressing a button on a connected controller.
Online mode
The online mode will piggyback on the local game mode, with the exception that the built-in GameKit matchmaking screen will happen before the lobby.
We will only support auto-matching (no invites) initially, to keep the scope smaller. After a match is established, the rest of the game should progress the same as locally - you get put into the lobby, you select your options, and you mark yourselves as ready.
There will be no mixing of local/online modes. I.e. it will not be possible to have 2 people on a couch playing online against other people on a different couch. I'd love to support this type of game mode, but I am wary about the scope, so for the first version, it didn't make the cut.
Training mode
I want the game to be inclusive. For example, if my 6 years old wants to play, I don't want her only choices to be multiplayer matches with me (or other people online). She might lose a lot initially, and ruin her enjoyment of the game.
But with a training mode, anyone can play solo until they are confident to try their luck with other players.
Ideally, the training mode would be some kind of "single-player campaign" mode, but again - let's keep the scope small.
Actual game
The actual gameplay is simple. The screen is partitioned into 1-4 columns, and each player plays in their column. There is no possibility of interfering with other players.
When pausing, you can see instructions and the possibility to return to the lobby.
Conclusion
Overall, I am glad I did the exercise of drawing this and thinking through the various options.
While the resulting flow doesn't seem complicated, there were two preceding iterations. Only after putting them to paper and stepping through them, did it become clear there were subtle nuances that didn't work well. E.g. if you have no lobby, how do you restart a game with the same players?