Flash game creation tutorial – part 1 (with AS3 classes)

Old readers should remember Flash game creation tutorial – part 1… it’s an ond AS2 tutorial about the creation of a game like Ball Revamped and its sequels.

Later Tim Edelaar coded it into AS3 in Step by step AS3 translation of Flash game creation tutorial – part 1, but with the whole code in a single class, and now it’s time for me to release the AS3 version of the tutorial using classes.

We are going to use three actionscript files: as3circle.as for the game, circle.as for the hero (the ball) and keys.as for keyboard input.

keys.as is the same class used in Introduction to AS3 classes so you can understand the importance of writing classes: I won’t have to worry for keyboard input anymore (well… as long as I am using arrows and space keys)

How to link classes

Linking classes is very important in AS3, that’s how you should manage class linking:

This is the movie properties panel:

Writing as3circle in the Document class field will set as3circle.as as the main class file.

This is the circle object properties panel:

Writing circle in the Class field will set circle.as as the class file for the circle object.

Now your .fla file and the three .as files must be in the same path.

And this is the code for every file… I don’t think there is any need to comment it because it was already commented in dozens of posts… anyway if you need comments, just ask for them in… the comments.

as3circle.as file:

package {
	import flash.display.Sprite;
	import flash.events.Event;
	public class as3circle extends Sprite {
		public var keyboard_input:keys;
		public var circle_hero = new circle;
		public function as3circle() {
			addChild(circle_hero);
			circle_hero.init();
			var keyboard_sprite = new Sprite();
			addChild(keyboard_sprite);
			keyboard_input = new keys(keyboard_sprite);
			stage.addEventListener(Event.ENTER_FRAME,on_enter_frame);
		}
		public function on_enter_frame(event:Event) {
			if (keyboard_input.is_left()) {
				circle_hero.apply_force(-1,0);
			}
			if (keyboard_input.is_right()) {
				circle_hero.apply_force(1,0);
			}
			if (keyboard_input.is_up()) {
				circle_hero.apply_force(0,-1);
			}
			if (keyboard_input.is_down()) {
				circle_hero.apply_force(0,1);
			}
		}
	}
}

circle.as file:

package {
	import flash.display.Sprite;
	import flash.events.Event;
	public class circle extends Sprite {
		private var x_speed:Number;
		private var y_speed:Number;
		private var power:Number;
		private var friction:Number;
		private var gravity:Number;
		public function circle() {
			addEventListener(Event.ENTER_FRAME, movement);
		}
		private function movement(e:Event) {
			x+=x_speed;
			y+=y_speed;
			rotation += x_speed;
			y_speed += gravity;
			x_speed *= friction;
			y_speed *= friction;
			if (x>500 || x<0 ||  y >400 || y<0) {
				init();
			}
		}
		public function apply_force(x_force,y_force) {
			x_speed += (x_force*power);
			y_speed += (y_force*power);
		}
		public function init() {
			gravity = 0.1;
			power = 0.66;
			friction = 0.99;
			x_speed = 0;
			y_speed = 0;
			x = 250;
			y = 200;
		}
	}
}

keys.as file

package {
	import flash.events.KeyboardEvent;
	public class keys {
		private var press_left = false;
		private var press_right = false;
		private var press_up = false;
		private var press_down = false;
		private var press_space = false;
		public function keys(movieclip) {
			movieclip.stage.addEventListener(KeyboardEvent.KEY_DOWN, key_down);
			movieclip.stage.addEventListener(KeyboardEvent.KEY_UP, key_up);
		}
		public function is_left() {
			return press_left;
		}
		public function is_right() {
			return press_right;
		}
		public function is_up() {
			return press_up;
		}
		public function is_down() {
			return press_down;
		}
		public function is_space() {
			return press_space;
		}
		private function key_down(event:KeyboardEvent) {
			if (event.keyCode == 32) {
				press_space = true;
			}
			if (event.keyCode == 37) {
				press_left = true;
			}
			if (event.keyCode == 38) {
				press_up = true;
			}
			if (event.keyCode == 39) {
				press_right = true;
			}
			if (event.keyCode == 40) {
				press_down = true;
			}
		}
		private function key_up(event:KeyboardEvent) {
			if (event.keyCode == 32) {
				press_space = false;
			}
			if (event.keyCode == 37) {
				press_left = false;
			}
			if (event.keyCode == 38) {
				press_up = false;
			}
			if (event.keyCode == 39) {
				press_right = false;
			}
			if (event.keyCode == 40) {
				press_down = false;
			}
		}
	}
}

And we have our oooold game running in AS3 with classes.

Download the source code and enjoy.

Get the most popular Phaser 3 book

Through 202 pages, 32 source code examples and an Android Studio project you will learn how to build cross platform HTML5 games and create a complete game along the way.

Get the book

214 GAME PROTOTYPES EXPLAINED WITH SOURCE CODE
// 1+2=3
// 100 rounds
// 10000000
// 2 Cars
// 2048
// A Blocky Christmas
// A Jumping Block
// A Life of Logic
// Angry Birds
// Angry Birds Space
// Artillery
// Astro-PANIC!
// Avoider
// Back to Square One
// Ball Game
// Ball vs Ball
// Ball: Revamped
// Balloon Invasion
// BallPusher
// Ballz
// Bar Balance
// Bejeweled
// Biggification
// Block it
// Blockage
// Bloons
// Boids
// Bombuzal
// Boom Dots
// Bouncing Ball
// Bouncing Ball 2
// Bouncy Light
// BoxHead
// Breakout
// Bricks
// Bubble Chaos
// Bubbles 2
// Card Game
// Castle Ramble
// Chronotron
// Circle Chain
// Circle Path
// Circle Race
// Circular endless runner
// Cirplosion
// CLOCKS - The Game
// Color Hit
// Color Jump
// ColorFill
// Columns
// Concentration
// Crossy Road
// Crush the Castle
// Cube Jump
// CubesOut
// Dash N Blast
// Dashy Panda
// Deflection
// Diamond Digger Saga
// Don't touch the spikes
// Dots
// Down The Mountain
// Drag and Match
// Draw Game
// Drop Wizard
// DROP'd
// Dudeski
// Dungeon Raid
// Educational Game
// Elasticity
// Endless Runner
// Erase Box
// Eskiv
// Farm Heroes Saga
// Filler
// Flappy Bird
// Fling
// Flipping Legend
// Floaty Light
// Fuse Ballz
// GearTaker
// Gem Sweeper
// Globe
// Goat Rider
// Gold Miner
// Grindstone
// GuessNext
// Helicopter
// Hero Emblems
// Hero Slide
// Hexagonal Tiles
// HookPod
// Hop Hop Hop Underwater
// Horizontal Endless Runner
// Hundreds
// Hungry Hero
// Hurry it's Christmas
// InkTd
// Iromeku
// Jet Set Willy
// Jigsaw Game
// Knife Hit
// Knightfall
// Legends of Runeterra
// Lep's World
// Line Rider
// Lumines
// Magick
// MagOrMin
// Mass Attack
// Math Game
// Maze
// Meeblings
// Memdot
// Metro Siberia Underground
// Mike Dangers
// Mikey Hooks
// Nano War
// Nodes
// o:anquan
// One Button Game
// One Tap RPG
// Ononmin
// Pacco
// Perfect Square!
// Perfectionism
// Phyballs
// Pixel Purge
// PixelField
// Planet Revenge
// Plants Vs Zombies
// Platform
// Platform game
// Plus+Plus
// Pocket Snap
// Poker
// Pool
// Pop the Lock
// Pop to Save
// Poux
// Pudi
// Pumpkin Story
// Puppet Bird
// Pyramids of Ra
// qomp
// Quick Switch
// Racing
// Radical
// Rebuild Chile
// Renju
// Rise Above
// Risky Road
// Roguelike
// Roly Poly
// Run Around
// Rush Hour
// SameGame
// SamePhysics
// Save the Totem
// Security
// Serious Scramblers
// Shrink it
// Sling
// Slingy
// Snowflakes
// Sokoban
// Space Checkers
// Space is Key
// Spellfall
// Spinny Gun
// Splitter
// Spring Ninja
// Sproing
// Stabilize!
// Stack
// Stick Hero
// String Avoider
// Stringy
// Sudoku
// Super Mario Bros
// Surfingers
// Survival Horror
// Talesworth Adventure
// Tetris
// The Impossible Line
// The Moops - Combos of Joy
// The Next Arrow
// Threes
// Tic Tac Toe
// Timberman
// Tiny Wings
// Tipsy Tower
// Toony
// Totem Destroyer
// Tower Defense
// Trick Shot
// Tunnelball
// Turn
// Turnellio
// TwinSpin
// vvvvvv
// Warp Shift
// Way of an Idea
// Whack a Creep
// Wheel of Fortune
// Where's my Water
// Wish Upon a Star
// Word Game
// Wordle
// Worms
// Yanga
// Yeah Bunny
// Zhed
// zNumbers