Advertisement

Quick Tip: A Simple Score Display for Flash Games

by
This post is part of a series called Shoot-'Em-Up.
Build a Stage3D Shoot-'Em-Up: Explosions, Parallax, and Collisions
Build a Stage3D Shoot-'Em-Up: Terrain, Enemy AI, and Level Data

Almost all games out there use a scoring system to help players see their progress. It is essential to show the player’s score in a clear and fun way. In this Quick Tip we're going to learn how to do just that!


Introduction

Click the button to add 20,000 points to your score:

In this Quick Tip we’re going to learn how to create a score display. To improve the quality of our display, we're going to do two things:

  1. Add commas to our score, so it reads 1,600,000 instead of 1600000. This makes it easier for the player to figure out how big his or her score is.
  2. Make our score transition between values, instead of changing immediately. This gives the player a sense of achievement, because he or she actually sees his score grow.

In the end we’ll have a very simple and useful class, which you can easily use within any of your projects.

This class will only concern itself with displaying the score, not with calculating it.


Step 1: Creating Our Class

First off let’s create our class; I’ve named it ScoreDisplay:

package
{
	import flash.display.Sprite;
	
	public class ScoreDisplay extends Sprite
	{
		public function ScoreDisplay()
		{
			
		}
	}
}

Step 2: Adding Our Score Variables

Let’s slowly add some variables:

package
{
	import flash.display.Sprite;
	
	public class ScoreDisplay extends Sprite
	{
		//the score which is being shown, whilst it is increasing
		public var currentScore:uint;
		
		//the player's score
		private var score:uint;
		
		
		public function ScoreDisplay()
		{
			
		}
	}
}

We’re going to show our score in a TextField. If you’d like to use a Symbol when working with ScoreDisplay, you won’t need to create the text field by code. However, if you don’t want to use a Symbol, you’ll need to call createScoreField().

Do remember that if you want to use your own Symbol, you must give the text field inside that symbol the instance name of currentScoreField.

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class ScoreDisplay extends Sprite
	{
		//the text field which will show currentScore
		public var currentScoreField:TextField;
		
		//the score which is being shown, whilst it is increasing
		public var currentScore:uint;
		
		//the player's score
		private var score:uint;
		
		public function ScoreDisplay()
		{
			
		}
		
		//if the developer won't link this class to a symbol, this method must be called
		public function createScoreField():void
		{
			currentScoreField = new TextField();
			addChild(currentScoreField);
		}
	}
}

Step 3: Changing and Setting Our Score

Now let’s start thinking what we’d like to do with our ScoreDisplay class. We’d like to be able to set a score, as well as add or subtract from the player’s score. So let’s create those methods!

package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	
	public class ScoreDisplay extends Sprite
	{
		//the text field which will show currentScore
		public var currentScoreField:TextField;
		
		//the player's score
		private var score:uint;
		
		//the score which is being shown, whilst it is increasing
		private var currentScore:uint;
		
		public function ScoreDisplay()
		{
			
		}
		
		//if the developer won't link this class to a symbol, this method must be called
		public function createScoreField():void
		{
			currentScoreField = new TextField();
			addChild(currentScoreField);
		}
		
		public function setScore(_value:uint):void
		{
			score = _value;	
		}
		
		public function changeScore(_change:uint):void
		{
			score += _change;
		}
	}
}

Step 4: Displaying Our Score

So far so good, we can now set and change the score’s value. But how will we display this? Even though it might not yet seem very useful, we’ll be using an enter frame event listener. Don’t worry it will make sense!

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	
	public class ScoreDisplay extends Sprite
	{
		//the text field which will show currentScore
		public var currentScoreField:TextField;
		
		//the player's score
		private var score:uint;
		
		//the score which is being shown, whilst it is increasing
		private var currentScore:uint;
		
		public function ScoreDisplay()
		{
			addEventListener(Event.ENTER_FRAME, showScore, false, 0, true);
		}
		
		//if the developer won't link this class to a symbol, this method must be called
		public function createScoreField():void
		{
			currentScoreField = new TextField();
			addChild(currentScoreField);
		}
		
		public function setScore(_value:uint):void
		{
			score = _value;	
		}
		
		public function changeScore(_change:uint):void
		{
			score += _change;
		}
		
		private function showScore(event:Event):void
		{
			currentScoreField.text = String(score);
		}
	}
}

Step 5: Our Partly Finished Class

If we’d like to use our class in a project, it would look like this. Seems to work right - the score changes - but we aren't done. Remember what we wanted to do?

  1. Add commas to our score, so it reads 1,600,000 instead of 1600000.
  2. Make our score transition between values, instead of changing immediately.

Step 6: Adding Commas

Let’s start with the first goal, adding commas.

package
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	
	public class ScoreDisplay extends Sprite
	{
		//the text field which will show currentScore
		public var currentScoreField:TextField;
		
		//the player's score
		private var score:uint;
		
		//the score which is being shown, whilst it is increasing
		private var currentScore:uint;
		
		public function ScoreDisplay()
		{
			addEventListener(Event.ENTER_FRAME, showScore, false, 0, true);
		}
		
		//if the developer won't link this class to a symbol, this method must be called
		public function createScoreField():void
		{
			currentScoreField = new TextField();
			addChild(currentScoreField);
		}
		
		public function setScore(_value:uint):void
		{
			score = _value;	
		}
		
		public function changeScore(_change:uint):void
		{
			score += _change;
		}
		
		private function showScore(event:Event):void
		{
			currentScoreField.text = addCommas(score);
		}
		
		private function addCommas(_score:uint):String
		{
			//a string, which will have the score with commas
			var scoreString:String = new String();
			
			//the amount of characters our score (without commas) has
			var scoreLength:uint = _score.toString().length;
			scoreString = "";
			
			//add the commas to the string
			for (var i:uint=0; i<scoreLength; i++) { 
				if ((scoreLength-i)%3 == 0 && i != 0) {
					scoreString += ",";
				}
				scoreString += _score.toString().charAt(i);
			}
			
			return scoreString;
		}
	}
}

Step 7: Transitioning Between Scores

Now let’s work on our second goal; transitioning between score values, instead of changing to the new value immediately.

For this we can use the awesome capabilities of the Tween class. Most times we think of the Tween class for moving display objects, but you can use it to change any numerical value, including our score.

package
{
	import fl.transitions.Tween;
	import fl.transitions.easing.*;
	
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.text.TextField;
	
	public class ScoreDisplay extends Sprite
	{
		//the amount of time (in ms) which is needed to transition from one score value to another one
		private static const TRANSITION_LENGTH:uint = 500;
		
		//the score which is being shown, whilst it is increasing
		public var currentScore:uint;
		
		//the player's score
		private var score:uint;
		
		//the text field which will show currentScore
		private var currentScoreField:TextField;
		
		//this will tween the current score's value
		private var currentScoreTween:Tween;
		
		public function ScoreDisplay()
		{
			addEventListener(Event.ENTER_FRAME, showScore, false, 0, true);
		}
		
		//if the developer won't link this class to a symbol, this method must be called
		public function createScoreField():void
		{
			currentScoreField = new TextField();
			addChild(currentScoreField);
		}
		
		public function setScore(_value:uint):void
		{
			score = _value;	
			
			tweenCurrentScore();
		}
		
		public function changeScore(_change:uint):void
		{
			score += _change;
			
			tweenCurrentScore();
		}
		
		private function showScore(event:Event):void
		{
			currentScoreField.text = addCommas(currentScore);
		}
		
		private function tweenCurrentScore():void
		{
			currentScoreTween = new Tween(this, "currentScore", None.easeNone, currentScore, TRANSITION_LENGTH, true);
		}
		
		private function addCommas(_score:uint):String
		{
			//a string, which will have the score with commas
			var scoreString:String = new String();
			
			//the amount of characters our score (without commas) has
			var scoreLength:uint = _score.toString().length;
			scoreString = "";
			
			//add the commas to the string
			for (var i:uint=0; i<scoreLength; i++) { 
				if ((scoreLength-i)%3 == 0 && i != 0) {
					scoreString += ",";
				}
				scoreString += _score.toString().charAt(i);
			}
			
			return scoreString;
		}
	}
}

We're Done!

And that’s it! You could extends this class and maybe add some sounds or “fancy graphics”. I hope you had a great time and learnt something, cheers!

Advertisement