In our GalacticArmada.asm file, we’ll define label called “NextGameState”. Our game will have 3 game states:
- Title Screen
- Story Screen
Here is how they will flow:
When one game state wants to go to another, it will need to change our previously declared ‘wGameState’ variable and then jump to the “NextGameState” label. There are some common things we want to accomplish when changing game states:
(during a Vertical Blank)
- Turn off the LCD
- Reset our Background & Window positions
- Clear the Background
- Disable Interrupts
- Clear All Sprites
- Initiate our NEXT game state
- Jump to our NEXT game state’s (looping) update logic
It will be the responsibility of the “init” function for each game state to turn the LCD back on.
NextGameState:: ; Do not turn the LCD off outside of VBlank call WaitForOneVBlank call ClearBackground; ; Turn the LCD off ld a, 0 ld [rLCDC], a ld a, 0 ld [rSCX],a ld [rSCY],a ld [rWX],a ld [rWY],a ; disable interrupts call DisableInterrupts ; Clear all sprites call ClearAllSprites ; Initiate the next state ld a, [wGameState] cp a, 2 ; 2 = Gameplay call z, InitGameplayState ld a, [wGameState] cp a, 1 ; 1 = Story call z, InitStoryState ld a, [wGameState] cp a, 0 ; 0 = Menu call z, InitTitleScreenState ; Update the next state ld a, [wGameState] cp a, 2 ; 2 = Gameplay jp z, UpdateGameplayState cp a, 1 ; 1 = Story jp z, UpdateStoryState jp UpdateTitleScreenState
The goal here is to ( as much as possible) give each new game state a blank slate to start with.
That’s it for the GalacticArmada.asm file.