Finally got 5th Open Source Game (1st in Cocos2D) "Dice in Cup" all done (or in other words - sick of working with it and wants to start another new one :-) ). The source link is at the end of this post.
As I mentioned before, I purposely picked this simple game idea to have a chance to get familiar with Cocos2D.
A high level flow of the game from code's point of view is as below:
1. Game first started, "init" calls "initialiseGameVariables" which set "GameState" to "kGameStateStarted"
2. "init" creates all cup/seeker objects, call "moveCupToRevealObject"
3. end of "moveCupToRevealObject" will call either "stateChange_startGame" or "stateChange_gameOverDisplay" depending on "GameState"
4. "stateChange_startGame" will reset all cups initial position, set "GameState" to "kGameStateMoveCups" then call "MoveCups"
5. "MoveCups" will move cups around, at the end of all cup move, calls "stateChange_CupMoveCompleted"
6. "stateChange_CupMoveCompleted" set "GameState" to "kGameStateUserActionStart"
7. after user clicked something, "observeValueForKeyPath" will set "GameState" to either "kGameStateIncorrectChoice" or "kGameStateCorrectChoice"
===== incorrect move
8. in "scheduleControl, if "GameState" is "kGameStateIncorrectChoice", it calls "moveCupToRevealObject", which same as #3 above at the end calls "stateChange_gameOverDisplay"
9. in "stateChange_gameOverDisplay", "Restart" been shown, wait for user click restart (calls "restartGame"
10. in restartGame", remove "Restart", then call "moveCupTorevealObject" and "initialiseGameVariables"
===== correct move
11. in "scheduleControl" if "GameState" is "kGameStateCorrectChoice", it updates score/level and then sets "GameState" to "kGameStateMoveOnToNextLevel"
12. also in "scheduleControl", it calls "updateDelayAndMoveNumber" and then sets "GameState" to "kGameStateStarted" - which then starts new level and repeats from #4 above
Did I confuse you? Hope not... I believe there should be other better/cleaner ways to handle the game logic, this is what I got so far. Welcomed to let me know if you got better ideas!
Also tested in iPad simulator, as below, might need to made some adjustment with the sprite size, other than that, it works perfectly.
A few other notes:
a. Same as previous game I used KVO to "observe" the correct/incorrect moves.
b. Tested rotation and Cocos2D handles that quite well, no extra code required.
c. Tested for memory leak in both Instrument 4.0 and 4.2, no leaking found.
d. Two places which I got stuck and spent most of the time is (1) the game state change which control the flow logic and (2) how to move the cups using the actions. As the CCSequence was mainly for running multiple actions on one Sprite, I end up creating 3 of them - one each! Let me know if you can think of better ideas!
e. As the main purpose of this exercise is just as a warm-up, to get familiar with Cocos2D, didn't try other stuffs like music/sound effect, menu, ...etc, will try to cover that in future projects.
Let me know if you found any problem with the code and hope you find this post interesting. Why not try one yourself and share it with everyone your better ideas!
Source for Dice in Cup V1.0