AS3 Flash game creation tutorial – part 6: timing
In previous part we added some gameplay, now it’s time to add timing.
I recommend you to read Understanding AS3 Timer Class.
I used time for two reasons: first, I want the player to collect as much coins as he can before a certain amount of time (to be defined), second to give the player some king of invulnerability every time he respawns.
To time the game, I created the time.as class with this content:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package {
import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.text.TextField;
public class time extends Sprite {
private var time_passed = new showtime;
public function time(movieclip) {
movieclip.addChild(time_passed);
var time_count:Timer = new Timer(1000);
time_count.addEventListener(TimerEvent.TIMER, show_time);
time_count.start();
}
public function show_time(event:TimerEvent) {
time_passed.timetext.text=String(event.target.currentCount);
}
}
} |
At line 7 showtime is a movieclip with a dynamic text to show time passed.
This class is invoked in the main as3circle.as file at line 6 and line 24, this way:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | package {
import flash.display.Sprite;
import flash.events.Event;
public class as3circle extends Sprite {
public var keyboard_input:keys;
public var time_limit:time;
public var circle_hero = new circle;
public var your_score = new score;
public var level_wall = new wall;
public var rotating_bar = new bar;
public var my_score = 0;
public var number_of_coins = 4;
public function as3circle() {
for (var i=1; i<=number_of_coins; i++) {
var ingame_coin = new coin;
addChild(ingame_coin);
}
addChild(your_score);
your_score.y= 250;
your_score.alpha = 0.2;
addChild(circle_hero);
addChild(rotating_bar);
keyboard_input = new keys(this);
time_limit = new time(this);
addChild(level_wall);
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);
}
}
public function add_score(points) {
my_score += points;
if (my_score<0) {
my_score = 0;
}
your_score.updatescore(my_score);
}
}
} |
As for the invulnerability, I set the hero’s alpha to 0.5 when he respawns at line 40 of circle.as, and in the same file I add 0.01 to the alpha at every frame, this way:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | 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() {
init();
addEventListener(Event.ENTER_FRAME, movement);
}
private function movement(e:Event) {
if (alpha<1) {
alpha+=0.01;
}
x+=x_speed;
y+=y_speed;
rotation += x_speed;
y_speed += gravity;
x_speed *= friction;
y_speed *= friction;
if (x>500 || x<0 || y >500 || 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 = 50;
y = 50;
alpha=0.5;
}
}
} |
This should grant almost two seconds of invulnerability at every respawn.
Then, I disabled the collision check with the bar and the coins (but I left the check with walls) when hero’s alpha is less than 1.
If you look at coin.as, you will find it at line 18:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | package {
import flash.display.Sprite;
import flash.events.Event;
public class coin extends Sprite {
// variables used in this class
private var dist_x:int;
private var dist_y:int;
private var distance:int;
// main function
public function coin() {
// calling place_coin function.
// this function randomly places the coin in the field
place_coin();
// checking for collisions at every frame
addEventListener(Event.ENTER_FRAME, check_collisions);
}
private function check_collisions(e:Event) {
if (as3circle(root).circle_hero.alpha ==1) {
// determining the distance between the hero and the coin
// notice how do I refer the hero
dist_x = x - as3circle(root).circle_hero.x;
dist_y = y - as3circle(root).circle_hero.y;
distance = dist_x*dist_x+dist_y*dist_y;
// 1809 = (hero radius + coin radius)^2
// this way I don't have to perform a square root to distance
if (distance < 1089) {
// if the hero picks up a coin, then move it elsewhere, add one point to the score and speed up the bar
as3circle(root).add_score(1);
as3circle(root).rotating_bar.adjust_speed(0.2);
place_coin();
}
}
}
private function place_coin() {
x = Math.floor(Math.random()*400)+50;
y = Math.floor(Math.random()*400)+50;
}
}
} |
and the same concept is applied to the bar.
Here it is the result:
And this is the source code for you to download. Next step will cover ads and leaderboards integration.
They can be easily customized to meet the unique requirements of your project.















(7 votes, average: 4.29 out of 5)









This post has 5 comments
Colin Diam
Can you make tutorial on game like mytheria on kongregate.com
substence
Why not make ‘as3circle’ a global static instead of referencing it with ‘as3circle(root)’? It’s very anti-OOP.
Hakeem De Hoyos
can you make a tutorial on making a game like sonic battle cards
http://www.newgrounds.com/portal/view/368002
=(
public function show_time(event:TimerEvent) {
time_passed.timetext.text=String(event.target.currentCount);
}
WHY PUBLIC ?
It must be private
iooppi
i did whole game, but i can not make an game over. i’m stucked at how to remove all those coin? when i use removechild, it gives error acces of undefined property ingame_coin. im trying to place coins on index 1 via addchildAt method , and i removed via removeChild but it also give an error 1009 at coin/check_collision. help pls :D