This week I focused on editing of my final report and adding tutorial sequences to the game.
I mentioned an issue in the previous post, I mentioned that one issue people playing the game had was finding it hard to know what to do without me giving hints, despite there being a written tutorial.
I then thought that I could follow traditional methods and incorporate the tutorials into the game. So, lacking voice actors, I decided to record the tutorials myself and add them into the game using a state manager (described below) that is updated after the player performs a certain action, or they can skip it by making a fist.
This video shows the tutorial sequence up until completing the game.
It has been suggested that the game needs a few more variations in bosses and a bit of variety of attacks. This is true but I think the current game gives a good demonstration of how to play it.
After a couple of tests with players, they seemed to understand the game better, although there is also a need to remove some actions from the game to prevent players accidentally performing an action in-game that has not been introduced yet. Perhaps there needs to be a game mechanic where you “learn” actions. This will need to be researched further.
Tutorial state manager
The state manager was a very simple function that changed a boolean and reset a timer. The timer was used restrict progression of the tutorials until they had been fully played back to the player.
// changes game state and resets timer private void ChangeState(string state) { _stateTimer = 0; _stateEntered = false; _gameState = state; }
Where you see “stateEntered” is basically a boolean used as a simple “enter” functionality without having to create an entire state machine for a simple prototype. If this is true, during the update loop, it will perform “enter” functioanlity (such as play a sound once and reset any flags), and then set the “_stateEntered” bool to “true” and therefore not performing things every frame.
The update functionality is similar to the following:
// state machine to control the game // mainly used for tutorial states switch(_gameState) { case "Setup": if(!_stateEntered) { PlaySound("Bad"); _stateEntered = true; } if(thalmicMyo.armRecognized) { PlaySound("Good"); ChangeState("Tutorial 1"); } break; case "Tutorial 1": if(!_stateEntered) { PlaySound("Tutorial 1"); _stateEntered = true; } if(jointObject.GetComponent<JointOrientation>().spreadDone && _stateTimer > 16.0f) { PlaySound("Good"); ChangeState("Tutorial 2"); } break; //... etc.
basically, all the state manager is doing it play an audio file, wait for the length of this file (tutorial speech) and then wait for the player to do something that triggers the next one. Super simple.
Future work
Some future work would include a “learning” system where the player cannot activate any action in the game until he or she has triggered it in a tutorial, thus activating it. This will prevent confusion, seeing as the game has no visuals to help with understanding the environment.
The distant future will include the addition of a story, more enemies, quests and more actions for the player to do. Each enemy would have different combinations of actions to beat it, and doing so will grant new abilities.
After this, I will be incorporating a GPS system to track quests as each quest will require the player to either be tracked moving 1 – 5 KM or a certain number of steps to reach the objective. This will hopefully be an interesting exercise routine app for mobile.