Score counter in AS3
Hi everyone,
The game I'm making is a shooter: alienships fly across the screen and when I click them, they die.
I want to have a dynamic text that keeps score of the number of ships I kill, but I'm not managing to do it.
I have a "Main class" and an "Alienship class" in my game. This code is in the "Alienship class":
function Alienship():void
{
addEventListener(MouseEvent.CLICK,whenclick);
}
private function whenclick(e:MouseEvent)
{
trace("You're dead\n");
parent.removeChild(this);
}
It removes the alienship off the screen. But how can I have a variable that increments on each killing?
Thanks
Chiapa
Senior Member
I would just add a "score" variable to the Main class and then increment score on "whenclick" with either: score++; OR score += scoreIncrement;
Hi steven, thanks for your reply
problem is, if I do that the score will increment each time I shoot, and not each time I shoot a spaceship.
Sorry, I tried doing that in the class Spaceship but the score is always one, each time I shoot the spaceship, because it's initialized for each spaceship as score:int = 0;
Can you help me, please?
Senior Member
Well the score variable should only be initialized once preferably in the Main Class, like you have score:int = 0;
Instead of using whenClick, just add the score increment code to the AS that handles the spaceship click. I don't know all your code, but the principle is the same. Initialize score and then increment on hit. Just add score increment to alienship event listener.
Well, the event listener is in the class "Spaceship", not in "Main", and therefore I can't use that variable in the class Spaceship (or I don't know how to)
The code:
Two classes: Main and Nave (meaning Spaceship);
-------------MAIN-------------------
package
{
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.ui.Mouse;
import flash.events.TimerEvent;
import flash.utils.Timer;
import flash.events.Event;
import flash.media.Sound;
import flash.net.*;
import flash.media.SoundChannel;
public class Main extends MovieClip
{
var total:int = 200;
var naves = new Array;
var tempo:Timer;
var tempo2:Timer;
var pontos:int = 0;
var tempojogo:Timer = new Timer(1000,1);
var musica_fundo:Sound = new Sound();
var tiro:Sound = new Sound();
function Main():void
{
play_btn.addEventListener(MouseEvent.CLICK, jogar);
function jogar(evt:MouseEvent):void
{
if (currentFrame == 1)
{
gotoAndStop(totalFrames);
}
else
Mouse.hide();
stage.addEventListener(MouseEvent.MOUSE_MOVE,mexe_ mira);
stage.addEventListener(MouseEvent.CLICK,som);
init_naves();
tempo = new Timer(700,total);
tempo.addEventListener(TimerEvent.TIMER,voa);
tempo.start();
tempo2 = new Timer(900,total);
tempo2.addEventListener(TimerEvent.TIMER,voa2);
tempo2.start();
tempojogo.addEventListener(TimerEvent.TIMER,contad or);
tempojogo.start();
tiro.load(new URLRequest("SFX/tiro4mp.mp3"));
}
}
function som(event:MouseEvent)
{
tiro.play(0);
}
function contador(event:TimerEvent)
{
contador_txt.text = String(tempojogo.currentCount);
}
private function voa(e:TimerEvent):void
{
var nave = naves.pop();
nave.voa();
}
private function voa2(e:TimerEvent):void
{
var nave = naves.pop();
nave.voa2();
}
private function init_naves():void
{
var nave1;
var nave2;
for (var i = 0; i < total; i++)
{
nave1 = new Nave ;
nave1.x = -30;
nave1.y = Math.floor(Math.random() * this.stage.stageHeight);
this.addChild(nave1);
naves.push(nave1);
}
musica_fundo.load(new URLRequest("Musica/Carmina.mp3"));
musica_fundo.play();
}
private function mexe_mira(event:MouseEvent)
{
Mouse.hide();
mira.x = mouseX;
mira.y = mouseY;
}
}
}
--------------------------------------
-------------NAVE-------------------
package
{
import flash.display.MovieClip;
import flash.events.*;
import flash.utils.Timer;
import flash.media.Sound;
import flash.net.*;
import flash.media.SoundChannel;
public class Nave extends MovieClip
{
var speed_x:int = 10;
var speed_x2:int = 12;
var speed_y:int = 2;
var speed_y2:int = -2;
// var pontos:int = 0;
function Nave():void
{
this.addEventListener(MouseEvent.CLICK, contapontos);
}
function contapontos(e:MouseEvent):void
{
// pontos = pontos + 1;
// trace(pontos);
}
private function quandoClique(e:MouseEvent)
{
trace("Já foste!\n");
parent.removeChild(this);
}
public function voa():void
{
this.addEventListener(Event.ENTER_FRAME, passa);
addEventListener(MouseEvent.CLICK,quandoClique);
}
public function voa2():void
{
this.addEventListener(Event.ENTER_FRAME, passa2);
addEventListener(MouseEvent.CLICK,quandoClique);
}
private function quandoFrame(e:Event)
{
x += speed_x;
y += speed_y;
}
private function passa(e:Event):void
{
this.x= (this.x)+speed_x;
this.y = (this.y)+speed_y;
}
private function passa2(e:Event):void
{
this.x= (this.x)+speed_x2;
this.y = (this.y)+speed_y2;
}
}
}
--------------------------------------
The names of the functions and variables are in Portuguese but if you want I can translate them to English, so you can understand better.
Thanks, Chiapa
Senior Member
To make a global variable use "public" as in: public var score:int = 0;
Declare this in your main class and it should work. Then manipulate from there.
I declared it public, in the Main class, and in the spaceship class, in the function that removes the spaceships when I click them, the code to increment the points variable. This is the error I got:
D:\Chiapa\Escola\Engenharia Informática\Tecnologias Multimédia\Flash\Chiapa game 2\Nave.as, Line 25 1120: Access of undefined property pontos.
Pontos means points and I tried:
points = points +1; trace(pontos);
in the same function that removes the spaceships off the screen
Last edited by Chiapa; 07-09-2012 at 08:12 PM .
Senior Member
It seems like you're not declaring it properly. And you've tried exactly:
Code:
public var pontos:int = 0;
Only place it in the Main class and try to trace pontos.
I can't get it to work: here's some code of the main class:
public class Main extends MovieClip
{
var total:int = 200;
var naves = new Array;
var tempo:Timer;
var tempo2:Timer;
public var pontos:int = 0;
var tempojogo:Timer = new Timer(1000,1);
var musica_fundo:Sound = new Sound();
var tiro:Sound = new Sound();
...
...
And some code of the spaceship class, where I use the variable "pontos":
private function quandoClique(e:MouseEvent)
{
trace("You're dead!\n");
parent.removeChild(this);
pontos = pontos + 1;
trace(pontos);
}
However, I get that error, it says that I can't access the variable pontos.
Help...
PHP Code:
package
{
import flash . display . MovieClip ;
import flash . events . MouseEvent ;
import flash . ui . Mouse ;
import flash . events . TimerEvent ;
import flash . utils . Timer ;
import flash . events . Event ;
import flash . media . Sound ;
import flash . net .*;
import flash . media . SoundChannel ;
public class Main extends MovieClip
{
var total : int = 200 ;
var naves = new Array;
var tempo : Timer ;
var tempo2 : Timer ;
var pontos : int = 0 ;
var tempojogo : Timer = new Timer ( 1000 , 1 );
var musica_fundo : Sound = new Sound ();
var tiro : Sound = new Sound ();
function Main (): void
{
play_btn . addEventListener ( MouseEvent . CLICK , jogar );
function jogar ( evt : MouseEvent ): void
{
if ( currentFrame == 1 )
{
gotoAndStop ( totalFrames );
}
else
Mouse . hide ();
stage . addEventListener ( MouseEvent . MOUSE_MOVE , mexe_ mira );
stage . addEventListener ( MouseEvent . CLICK , som );
init_naves ();
tempo = new Timer ( 700 , total );
tempo . addEventListener ( TimerEvent . TIMER , voa );
tempo . start ();
tempo2 = new Timer ( 900 , total );
tempo2 . addEventListener ( TimerEvent . TIMER , voa2 );
tempo2 . start ();
tempojogo . addEventListener ( TimerEvent . TIMER , contad or);
tempojogo . start ();
tiro . load (new URLRequest ( "SFX/tiro4mp.mp3" ));
}
}
function som ( event : MouseEvent )
{
tiro . play ( 0 );
}
function contador ( event : TimerEvent )
{
contador_txt . text = String ( tempojogo . currentCount );
}
private function voa ( e : TimerEvent ): void
{
var nave = naves . pop ();
nave . voa ();
}
private function voa2 ( e : TimerEvent ): void
{
var nave = naves . pop ();
nave . voa2 ();
}
private function init_naves (): void
{
var nave1 ;
var nave2 ;
for (var i = 0 ; i < total ; i ++)
{
nave1 = new Nave ;
nave1 . x = - 30 ;
nave1 . y = Math . floor ( Math . random () * this . stage . stageHeight );
this . addChild ( nave1 );
naves . push ( nave1 );
}
musica_fundo . load (new URLRequest ( "Musica/Carmina.mp3" ));
musica_fundo . play ();
}
private function mexe_mira ( event : MouseEvent )
{
Mouse . hide ();
mira . x = mouseX ;
mira . y = mouseY ;
}
}
}
-------------------------------
This is the Spaceship class:
PHP Code:
package
{
import flash . display . MovieClip ;
import flash . events .*;
import flash . utils . Timer ;
import flash . media . Sound ;
import flash . net .*;
import flash . media . SoundChannel ;
public class Nave extends MovieClip
{
var speed_x : int = 10 ;
var speed_x2 : int = 12 ;
var speed_y : int = 2 ;
var speed_y2 : int = - 2 ;
// var pontos:int = 0;
function Nave (): void
{
this . addEventListener ( MouseEvent . CLICK , contapontos );
}
function contapontos ( e : MouseEvent ): void
{
// pontos = pontos + 1;
// trace(pontos);
}
private function quandoClique ( e : MouseEvent )
{
trace ( "Já foste!\n" );
parent . removeChild ( this );
// pontos = pontos + 1 ;
// trace(pontos);
}
public function voa (): void
{
this . addEventListener ( Event . ENTER_FRAME , passa );
addEventListener ( MouseEvent . CLICK , quandoClique );
}
public function voa2 (): void
{
this . addEventListener ( Event . ENTER_FRAME , passa2 );
addEventListener ( MouseEvent . CLICK , quandoClique );
}
private function quandoFrame ( e : Event )
{
x += speed_x ;
y += speed_y ;
}
private function passa ( e : Event ): void
{
this . x = ( this . x )+ speed_x ;
this . y = ( this . y )+ speed_y ;
}
private function passa2 ( e : Event ): void
{
this . x = ( this . x )+ speed_x2 ;
this . y = ( this . y )+ speed_y2 ;
}
}
}
Senior Member
Ok just tested this out. Try the following.
public static var pontos:int = 0;
And reference by using Class.variable, ie "trace(Main.pontos);"
Thanks Steven
I had already tried that and it worked. The static variable worked fine, someone in another forum suggested it first but thanks anyway.
Chiapa
Senior Member
Glad you got it working. Sorry, i thought it was just something on your end, but it was the "static" keyword that was missing.
I'm not one to use external AS files, i like to keep it all in the FLA or just Main class if possible. Happy flashing.
Yeah, I had that thought too, working on the fla file or merging the classes in one.
Thanks for your help and trouble
Chiapa
Posting Permissions
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
Forum Rules
Click Here to Expand Forum to Full Width