AS3: Reset variables and repeat part of function - actionscript-3

This is a class of my schoolproject but it doesn't work right now. http://pastebin.com/0K9H6wAi
I have a frog who blinks 3 times and than moves - so far, so good.
But when it has moves it has to blink again and move again, and i cant figure this out. This happens in line 109 till the end.
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.geom.Point;
public class KikkerOgen extends MovieClip {
var timer:Timer = new Timer(1000, 4);
var geknipperd:int = 0;
var hoevaakKnipperen:int = 0;
var aantalGezwommen
var score:int = 0;
//boompjes en bosjes
var object_1:Point = new Point(57,84);
var object_2:Point = new Point(500,86);
var object_3:Point = new Point(46,168);
var object_4:Point = new Point(479,126);
var object_5:Point = new Point(69,159);
var object_6:Point = new Point(443,162);
var object_7:Point = new Point(248,316);
var object_8:Point = new Point(209,198);
var object_9:Point = new Point(163,357);
var object_10:Point = new Point(440,283);
//constructor
public function KikkerOgen()
{
addEventListener(Event.ENTER_FRAME, Update);
addEventListener(MouseEvent.CLICK, isClicked);
timer.addEventListener(TimerEvent.TIMER, Knipperen);
timer.start();
gotoAndStop(13);
}
public function Update (event:Event)
{
trace(currentFrame);
}
//Score moet bij deze functie omhoog - document class
public function isClicked (event:MouseEvent):void
{
this.parent.removeChild(this);
}
//Hier telt hij het aantal keren dat de kikker moet knipperen
function Knipperen (event:TimerEvent):void
{
if (event.currentTarget.currentCount >= 2 && geknipperd < 3) {
geknipperd ++;
gotoAndPlay(1);
}
//Wanneer de kikker 3x geknipperd heeft moet hij naar een nieuwe positie
if (geknipperd == 3)
{
//Selecteer een random positie om heen te zwemmen
switch(Math.round(Math.random() * 10))
{
case 1:
x = object_1.x;
y = object_1.y;
break;
case 2:
x = object_2.x;
y = object_2.y;
break;
case 3:
x = object_3.x;
y = object_3.y;
break;
case 4:
x = object_4.x;
y = object_4.y;
break;
case 5:
x = object_5.x;
y = object_5.y;
break;
case 6:
x = object_6.x;
y = object_6.y;
break;
case 7:
x = object_7.x;
y = object_7.y;
break;
case 8:
x = object_8.x;
y = object_8.y;
break;
case 9:
x = object_9.x;
y = object_9.y;
break;
case 10:
x = object_10.x;
y = object_10.y;
break;
}
trace("posX:"+x);
trace("posY:"+y);
//Reset de timmer, het knipperen en laat hem opnieuw tellen om te verplaatsen.
geknipperd = 0;
trace(geknipperd);
timer.reset();
aantalGezwommen ++;
}
}
//Wanneer de kikker 3x is verplaats verwijder hem uit het spel
function removeKikker ()
{
if (aantalGezwommen == 3)
{
this.parent.removeChild(this);
}
}
}
}
Any idea what goes wrong here?

You call timer.reset(); which stops the timer but doesn't start it again.
Stops the timer, if it is running, and sets the currentCount property back to 0, like the reset button of a stopwatch.
Timer # AS3 reference
After you reset the timer, be sure to start it again with timer.start();

Related

AS3 character movement - making the character jump

I'm making a (really) simple platform game for a school project with a little help from different online tuts.
For a couple of days I have been trying to make the character jump. I don't get any errors and if i test it with a trace statement the statement appears in the output. I tried several ways that I found in different tuts but couldn't make it work.
This is the code i've been using for my character:
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.ui.Keyboard;
import flash.geom.Point;
public class ana extends MovieClip {
private var _vx:Number;
private var _halfWidth:Number;
private var _previousKey:uint;
public var speler:ana;
// variabelen die bij de jump functie horen
var upKeyDown:Boolean = false;
var mainJumping:Boolean = false;
var jumpSpeedLimit:int = 15;
var jumpSpeed:Number = jumpSpeedLimit;
public function ana() {
this.addEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
}
private function onAddedToStage(event:Event):void {
this._vx = 0;
this._halfWidth = this.width / 2;
this._previousKey = Keyboard.RIGHT;
this.stop();// toegevoegd zodat de loop cycle van de speler stopt aan het begin van het spel
/*EVENT LISTENERS*/
stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyboardDown);
stage.addEventListener(KeyboardEvent.KEY_UP, onKeyboardUp);
this.addEventListener(Event.ENTER_FRAME, onEnter);
this.addEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
}
private function onRemovedFromStage(event:Event):void {
this.removeEventListener(Event.ENTER_FRAME, onEnter);
this.removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
this.removeEventListener(Event.REMOVED_FROM_STAGE, onRemovedFromStage);
}
private function onKeyboardDown(event:KeyboardEvent):void {
//zorgt ervoor dat het character de juiste richting op rent
var currentKey:uint = event.keyCode;
//Voor de linker toets
if (event.keyCode == Keyboard.LEFT){
// Als de huidige toets niet gelijk is aan vorige, dan wordt het character gedraait
if (currentKey != _previousKey) {
_previousKey = currentKey;
this.scaleX *= -1;
}
// De run cycle wordt aangeroepen, de positie van het character verplaatst naar links met X frames per seconden
loopRun();
_vx = -8;
}
// voor de rechter toets
if (event.keyCode == Keyboard.RIGHT){
if (currentKey != _previousKey) {
_previousKey = currentKey;
this.scaleX *= -1;
}
// zelfde als vorige if statement, alleen -X wordt X om de richting van links naar rechts te veranderen
loopRun();
_vx = 8;
}
/*Het is me niet gelukt om de speler te laten springen*/
if (event.keyCode == Keyboard.SPACE) {
mainJump();
trace("spring");
}
/*Functie om de speler te laten springen
werkt helaas niet... krijg ook geen error messages...
heb verschillende manieren en codes geprobeert...
Deze code komt uit de volgende tutorial: http://goo.gl/S5VRd0 */
function mainJump():void{
if(!mainJumping){
mainJumping = true;
jumpSpeed = jumpSpeedLimit*-1;
this.y += jumpSpeed;
} else {
if(jumpSpeed < 0){
jumpSpeed *= 1 - jumpSpeedLimit/75;
if(jumpSpeed > -jumpSpeedLimit/5){
jumpSpeed *= -1;
}
}
if(jumpSpeed > 0 && jumpSpeed <= jumpSpeedLimit){
jumpSpeed *= 1 + jumpSpeedLimit/50;
}
this.y += jumpSpeed;
if(this.y >= stage.stageHeight - this.height){
mainJumping = false;
this.y = stage.stageHeight - this.height;
}
}
}
}
// bron: Flash AS3 Simple Game 04: player class http://www.youtube.com/watch?v=u4dwuAUYrkg
private function onKeyboardUp(event:KeyboardEvent):void {
if (event.keyCode == Keyboard.LEFT || event.keyCode == Keyboard.RIGHT) {
_vx = 0;
gotoAndStop(1);
}
}
private function onEnter(event:Event):void {
this.x += _vx;
checkStageBoundaries();
}
private function loopRun():void {
//zorgt ervoor dat de run cycle van het character blijft 'loopen'
if (currentFrame == 12) {
gotoAndPlay(1);
}
else {
play();
}
}
private function checkStageBoundaries():void {
//controleert of de speler zich buiten de grenzen van de stage begint en blokkeerd de speler als hij de stage wil verlaten
//van volgende tutorial overgenomen: Flash as3 simple game 04: Player Class http://www.youtube.com/watch?v=u4dwuAUYrkg
if (this.x - _halfWidth < 0) {
this.x = 0 + _halfWidth;
}
else if (this.x + _halfWidth > stage.stageWidth) {
this.x = stage.stageWidth - _halfWidth;
}
}
}
}
The code is heavily commented in dutch due to the nature of the assignment.
Just in case here is my main class:
package {
import flash.display.MovieClip;
import flash.events.*;
import flash.display.Sprite;
import flash.display.SimpleButton;
import flash.events.MouseEvent;
import flash.display.*;
import flash.events.*;
import flash.geom.*;
import flash.text.*;
import flash.utils.*;
import flash.ui.*;
public class Main extends MovieClip {
/*VARIABELEN*/
public var startScreen:StartScreen; //beginscherm
public var playScreen:PlayScreen; // speel scherm
public var startBtn:StartBtn; // start knop die naar het speel scherm gaat
public var speler:ana = new ana; // speler
/*variabelen voor de diamantjes*/
public var diamant:Diamond = new Diamond;
public var diamant2:Diamond = new Diamond;
public var diamant3:Diamond = new Diamond;
public var diamant4:Diamond = new Diamond;
public var info:infoTxt = new infoTxt;
public function Main() {
//Start scherm op stage & startknop
show_startScreen(); // roept functie aan om het startscherm te laten zien
startBtn.addEventListener(MouseEvent.CLICK, playGame); //voegt muisevent toe aan de startknop
}
// speel scherm
public function show_startScreen() { // functie voor startscherm
/*variabelen voor de mc's*/
startScreen = new StartScreen(this);
startBtn = new StartBtn;
/*toevoegen startscherm en startknop*/
addChild(startScreen);
addChild(startBtn);
/*positionering startknop*/
startBtn.y = 230;
startBtn.x = 400;
}
public function playGame(event:MouseEvent) { //roept functie voor de startknop aan
play_game();
}
public function play_game() { //deze code wordt uitgevoerd nadat de playGame functie is aangeroepen
playScreen = new PlayScreen(this); //variabel voor het speel scherm
if (startScreen) { //deze code zorgt ervoor dat het beginscherm wordt verwijderd
removeChild(startScreen);
startScreen = null;
}
addChild(playScreen); //voegt speelscherm toe
addChild(speler); //voegt speler toe
addChild(info); // voegt de informatie text toe
/* positionering info text*/
info.x = 20;
info.y = 20;
/*positionering speler*/
speler.y = 400;
speler.x = 0;
/*toevoegen en positioneren van diamantjes, de y as staat al gedefinieerd in de Diamanond class*/
addChild(diamant);
diamant.x = 450;
addChild(diamant2);
diamant2.x = 570;
addChild(diamant3);
diamant3.x = 690;
addChild(diamant4);
diamant4.x = 810;
// event listener voor de speler, die wordt aangeroepen bij elk frame
speler.addEventListener(Event.ENTER_FRAME, diamondCollision);
// Collision functie, die ervoor zorgt dat de diamantjes verdwijnen als de speler ze aanraakt
// over hitTestObject staat heel veel info op internet, hier heb ik geen speciefieke tutorial voor gebruikt
// heb hitTestObject functie ook eerder gebruikt voor de groeps game
function diamondCollision (event:Event):void {
if (diamant != null) {// als diamant er nog is
if (speler.hitTestObject(diamant)){// als de speler de diamant aanraakt
removeChild(diamant);// verwijder de mc
diamant = null; // zorgt ervoor dat het niet herhaald kan worden
}
}
/*Hetzelfde voor de andere 3 diamantjes*/
if (diamant2 != null) {
if (speler.hitTestObject(diamant2)) {
removeChild(diamant2);
diamant2 = null;
}
}
if (diamant3 != null) {
if (speler.hitTestObject(diamant3)) {
removeChild(diamant3);
diamant3 = null;
}
}
if (diamant4 != null) {
if (speler.hitTestObject(diamant4)) {
removeChild(diamant4);
diamant4 = null;
}
}
}
}
}
}
I uploaded the swf file to swfcabin, so you can see the rest works fine: http://www.swfcabin.com/open/1404819729.
Can anyone help me getting my character to jump?
Thank you!
Your jumpSpeed alteration should reside in an enterframe listener, onEnter, moreover, you should relocate the mainJump() code into there, as gravity should act once per frame. Only the jump initialization code should remain in the mainJump function, that is, check if jumping, if not make it jump, assign y-speed and leave the function.
private function onEnter(event:Event):void {
this.x += _vx;
if (mainJumping) {
if(jumpSpeed < 0){
jumpSpeed *= 1 - jumpSpeedLimit/75;
if(jumpSpeed > -jumpSpeedLimit/5){
jumpSpeed *= -1;
}
}
if(jumpSpeed > 0 && jumpSpeed <= jumpSpeedLimit){
jumpSpeed *= 1 + jumpSpeedLimit/50;
}
this.y+=jumpSpeed;
if(this.y >= stage.stageHeight - this.height){
mainJumping = false;
this.y = stage.stageHeight - this.height;
jumpSpeed=0;
}
}
checkStageBoundaries();
}
function mainJump():void{
if(!mainJumping){
mainJumping = true;
jumpSpeed = jumpSpeedLimit*-1;
this.y += jumpSpeed;
} // enough!
}

AS3: Part of code doesnt get executed

So, I need to remove my frog, from a small flash game, after 3 times moving, I'm trying to do this with 'aantalGezwommen' and a function, sadly it doesn't work with the code now.
I can't figure it out, any of you got an idea?
I have included the whole code, so if something else is wrong, please tell :)
package {
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.utils.Timer;
import flash.events.TimerEvent;
import flash.geom.Point;
public class KikkerOgen extends MovieClip {
var timer:Timer = new Timer(1000, 4);
var geknipperd:int = 0;
var hoevaakKnipperen:int = 0;
var aantalGezwommen:int = 0;
var score:int = 0;
//boompjes en bosjes
var object_1:Point = new Point(57,84);
var object_2:Point = new Point(500,86);
var object_3:Point = new Point(46,168);
var object_4:Point = new Point(479,126);
var object_5:Point = new Point(69,159);
var object_6:Point = new Point(443,162);
var object_7:Point = new Point(248,316);
var object_8:Point = new Point(209,198);
var object_9:Point = new Point(163,357);
var object_10:Point = new Point(440,283);
//constructor
public function KikkerOgen()
{
addEventListener(Event.ENTER_FRAME, Update);
addEventListener(MouseEvent.CLICK, isClicked);
timer.addEventListener(TimerEvent.TIMER, Knipperen);
timer.start();
gotoAndStop(13);
}
public function Update (event:Event)
{
trace(currentFrame);
}
//Score moet bij deze functie omhoog - document class
public function isClicked (event:MouseEvent):void
{
this.parent.removeChild(this);
}
//Hier telt hij het aantal keren dat de kikker moet knipperen
function Knipperen (event:TimerEvent):void
{
if (event.currentTarget.currentCount >= 2 && geknipperd < 3) {
geknipperd ++;
gotoAndPlay(1);
}
//Wanneer de kikker 3x geknipperd heeft moet hij naar een nieuwe positie
if (geknipperd == 3)
{
//Selecteer een random positie om heen te zwemmen
switch(Math.round(Math.random() * 10))
{
case 1:
x = object_1.x;
y = object_1.y;
break;
case 2:
x = object_2.x;
y = object_2.y;
break;
case 3:
x = object_3.x;
y = object_3.y;
break;
case 4:
x = object_4.x;
y = object_4.y;
break;
case 5:
x = object_5.x;
y = object_5.y;
break;
case 6:
x = object_6.x;
y = object_6.y;
break;
case 7:
x = object_7.x;
y = object_7.y;
break;
case 8:
x = object_8.x;
y = object_8.y;
break;
case 9:
x = object_9.x;
y = object_9.y;
break;
case 10:
x = object_10.x;
y = object_10.y;
break;
}
trace("posX:"+x);
trace("posY:"+y);
//Reset de timmer, het knipperen en laat hem opnieuw tellen om te verplaatsen.
geknipperd = 0;
trace(geknipperd);
//Tel hoevaak het kikkertje verplaatst is om de kikker bij 3x van stage te verwijderen.
if (aantalGezwommen < 3) {
aantalGezwommen++;
}
timer.reset();
timer.start();
}
}
//Wanneer de kikker 3x is verplaats verwijder hem uit het spel
function removeKikker ()
{
if (aantalGezwommen == 3)
{
this.parent.removeChild(this);
}
}
}
}
Apologies for the Dutch notes, things I need to remember :)
Nowhere in your code you are calling the removeKikker function. For a function to run it has to be called.

As3 error #1009 cant find out

Have been looking at this code for hours cant find out whats wrong :X
please somebody help me figure this out im going crazy
I still have a huge problem i go to the frame 1 and i see the frame 3 on background still running... and when the game restarts ships and stuff still there idk how to "restart" that :/
/* Código que pára a timeline na 1 frame para que o menu continue apresentado*/
stop();
import flash.text.Font;
Font.registerFont(space);
/*Movimenta a nave fazendo a seguir os movimentos do rato e esconde o cursor do sistema operacional*/
addEventListener( Event.ENTER_FRAME, gameLoop );
// create the array for the bullets
var bullets:Array = [];
// create the array for the enemies
var enemies:Array = [];
var pontos=0;
var toma:TOMA = new TOMA();
stage.addChild(arma_tiro);
arma_tiro.mouseEnabled = false;
arma_tiro.addEventListener(Event.ENTER_FRAME, fl_CustomMouseCursor);
function fl_CustomMouseCursor(event:Event)
{
arma_tiro.x = stage.mouseX;
}
Mouse.hide();
/* Mouse Click Event
Clicking on the specified symbol instance executes a function in which you can add your own custom code.
Instructions:
1. Add your custom code on a new line after the line that says "// Start your custom code" below.
The code will execute when the symbol instance is clicked.
*/
stage.addEventListener(MouseEvent.CLICK, fl_MouseClickHandler_3);
function fl_MouseClickHandler_3( event:MouseEvent ):void
{
toma.play();
// create the bullet
var bullet:bullet_ = new bullet_();
addChild(bullet);
bullet.x=arma_tiro.x;
bullet.y=arma_tiro.y;
// add the bullet to the bullets array
bullets.push(bullet);
bullet.addEventListener(Event.ENTER_FRAME, moverbala);
}
function moverbala(event:Event):void // função para mover a bala para cima */
{
event.target.y=event.target.y-20;
}
//stage.addEventListener(Event.ENTER_FRAME, Primeira);
setInterval(Primeira, 1500) ; //define intervalo de tempo entre as varias repetiçoes da funçao
function Primeira():void
{
var invader1:invader_1 = new invader_1();
addChild(invader1);
invader1.x=0;
invader1.y=120;
enemies.push( invader1 );
invader1.addEventListener(Event.ENTER_FRAME, mover1);
}
function mover1(event:Event):void
{
event.target.x+= -9;
}
//Nave 2
setInterval(Segunda, 750) ; //define intervalo de tempo entre as varias repetiçoes da funçao
function Segunda():void
{
var invader2:invader_2 = new invader_2();
addChild(invader2);
invader2.x=0;
invader2.y=85;
enemies.push( invader2 );
invader2.addEventListener(Event.ENTER_FRAME, mover2);
}
function mover2(event:Event):void // função para mover a nave para lado direito */
{
event.target.x+=-5;
}
//Nave 3
setInterval(Terceira, 1000) ; //define intervalo de tempo entre as varias repetiçoes da funçao
function Terceira():void
{
var invader3:invader_3 = new invader_3();
addChild(invader3);
invader3.x=0;
invader3.y=45;
enemies.push( invader3 );
invader3.addEventListener(Event.ENTER_FRAME, mover3);
}
function mover3(event:Event):void // função para mover a nave para lado direito */
{
event.target.x+=-3;
}
//bonus
setInterval(bonus, 7500) ; //define intervalo de tempo entre as varias repetiçoes da funçao
function bonus():void
{
var bonus:bonus_1 = new bonus_1();
addChild(bonus);
bonus.x=0;
bonus.y=15;
enemies.push(bonus);
bonus.addEventListener(Event.ENTER_FRAME, mover4);
}
function mover4(event:Event):void // função para mover a nave para lado direito */
{
event.target.x+=-5;
}
function gameLoop(event:Event):void
{
var firstLoop:Boolean = true;
// loop to move/remove the bullets
for( var a:int = bullets.length-1; a>=0; a-- )
{
bullets[a].y -= 20;
// if the bullet is not on screen anymore, remove it from array
if( bullets[j].y < 0 )
{
removeChild( bullets[a] );
bullets.splice(a,1);
continue;
}
}
// loop enemies
for( var i:int = enemies.length-1; i>=0; i-- )
{
// move the enemy
enemies[i].x += 10;
// loop the bullets to see if on collide the enemy
for( var j:int = bullets.length-1; j>=0; j-- )
{
// test collision with the enemy
if( enemies[i].hitTestObject( bullets[j] ))
{
// make your enemy dead
removeChild( enemies[i] );
pontos++;
// remove it from the array
enemies.splice(i,1);
pontox.text = String(pontos);
}
}
}
}
/* Countdown Timer
Counts down from a specified number of seconds.
Instructions:
1. To change the length of the countdown, change the value 10 in the first line below to the number of seconds you want.
*/
pontoss.text= "pontos";
tempos.text = "tempo";
var fl_SecondsToCountDown:Number = 30;
var fl_CountDownTimerInstance:Timer = new Timer(1000, fl_SecondsToCountDown);
fl_CountDownTimerInstance.addEventListener(TimerEvent.TIMER, fl_CountDownTimerHandler);
fl_CountDownTimerInstance.start();
function fl_CountDownTimerHandler(event:TimerEvent):void
{
if (fl_SecondsToCountDown >1)
{
tempo.text = String(fl_SecondsToCountDown);
fl_SecondsToCountDown--;
};
if (fl_SecondsToCountDown == 2)
{
stop();
gotoAndStop(1);
};
}
Don't you intend to stop the timer?
So perhaps you meant fl_CountDownTimerInstance.stop(); instead of stop()..
//..
if (fl_SecondsToCountDown == 2)
{
fl_CountDownTimerInstance.stop();
gotoAndStop(1);
};
}
//..

AS3 - Draggable squares generate from an Array

Good Morning,
I have a grid (bankgrid) generated by a var bankArray:Array who takes Array's value to show by a gotoAndStop(that number (f)) a colorful grid.
All squares are children from the same MovieClip(TBank) generates one after one with horizontal(i) and vertical (j) position in the Array.
I'm trying to make there squares draggable... in vain :
var bankgrille:MovieClip = new MovieClip();
var bankList:Vector.<TBank> = new Vector.<TBank>();
var bankArray:Array = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0],
[0,0,2,0,1,0,0,0],
[0,2,2,2,2,0,0,0],
[0,1,2,2,1,0,0,0],
[0,2,1,1,2,1,1,0]
];
var bankstock:Array = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0]
];
function colorBank():void {
for (var i:int=0; i<8; i++){ // boucle sur les 20 colonnes
for (var j:int=0; j<8; j++){ // boucle sur les 15 lignes de chaque colonne
var f:int = bankArray[j][i] // valeur de la case
if(f > 0)
{ // si la valeur de la case est supérieure à 0
var tBank:TBank = new TBank()
bankList.push(tBank);
// création du modèle
tBank.x = 320+i*20; // position sur X
tBank.y = 100+j*20; // position sur Y
tBank.gotoAndStop(f);
bankgrille.addChild(tBank);
}
else
{
bankstock[j][i] = []
}
}
}
}
colorBank();
addChild(bankgrille);
My future project (to maybe make my question more senseful) :
'After that, I'd like to permit to drag there squares and drop them on another Array to change second one colours'
startDrag() is a good place to start when it comes to dragging movie clips.
You can assign a MouseEvent listener to the entire grid and drag a specific element using event.currentTarget:
bankgrille.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
bankgrille.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
function onMouseDown(e:MouseEvent):void
{
e.currentTarget.startDrag();
}
function onMouseUp(e:MouseEvent):void
{
e.currentTarget.stopDrag();
}
And Voilà ! Thank you again Sim !
var bankgrille:MovieClip = new MovieClip();
var bankList:Vector.<TBank> = new Vector.<TBank>();
var bankArray:Array = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,1,0,0,0,0,0],
[0,0,2,0,1,0,0,0],
[0,2,2,2,2,0,0,0],
[0,1,2,2,1,0,0,0],
[0,2,1,1,2,1,1,0]
];
var bankstock:Array = [
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0]
];
function colorBank():void {
for (var i:int=0; i<8; i++){ // boucle sur les 20 colonnes
for (var j:int=0; j<8; j++){ // boucle sur les 15 lignes de chaque colonne
var f:int = bankArray[j][i] // valeur de la case
if(f > 0)
{ // si la valeur de la case est supérieure à 0
var tBank:TBank = new TBank()
bankList.push(tBank);
// création du modèle
tBank.x = 320+i*20; // position sur X
tBank.y = 100+j*20; // position sur Y
tBank.gotoAndStop(f);
bankgrille.addChild(tBank);
}
else
{
bankstock[j][i] = []
}
}
}
}
colorBank();
addChild(bankgrille);
draggable();
function draggable()
{
for each(var t:TBank in bankList)
{
t.addEventListener(MouseEvent.MOUSE_DOWN, clik);
t.addEventListener(MouseEvent.MOUSE_UP, lache);
var posX=t.x;
if (t.x != posX)
{
t.x = posX;
}
function clik(e:MouseEvent):void
{
e.currentTarget.startDrag();
}
function lache(e:MouseEvent):void
{
e.currentTarget.stopDrag();
}
}
}

Error #2025 with my memory game AS3

I've been busy with creating a memory game (card matching), but I've come across a bug which I have to solve before wednesday as it is a project for my school.
I've tried alot of ways to try and fix this problem, but as this is the first AS3 script that I have ever written I don't know a way to solve it.
The error occurs when I match 1 pair of cards and the timer runs out of time or you win.
Detailed error report:
ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::DisplayObjectContainer/removeChild()
at main/lose()[C:\Users\Remy\Desktop\Schoolmap\FLASH\memory1_0\main.as:253]
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at flash.utils::Timer/tick()
And here is my oh so sloppy script ;)
package
{
// hier import ik de benodigde items.
import flash.display.MovieClip;
import flash.display.SimpleButton;
import flash.display.Sprite;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.text.TextFormat;
import flash.utils.Timer;
import flash.events.MouseEvent;
import flash.events.Event;
/**
* #author Remy&Mark
*/
public class main extends MovieClip
{
hier initialize ik de var's.
var kaart1:MovieClip;
var kaarten:Array; // ARRAY is een table.
var pause_timer:Timer; // Timer voor tijd dat kaarten terug worden gedraaid.
var kaart1open:Boolean; // benodige booleans en nummers
var kaart2open:Boolean;
var kaart1value:Number;
var kaart2value:Number;
var kaart1id:Number;
var kaart2id:Number;
var cardsRemoved:Number;// einde
var button:Sprite;// dit is de button
var values:Array; //just declare it here, instead of initializing it here
var startknop:MovieClip = new startKnop(); // maakt de startknop
var tryAgain:MovieClip = new taKnop(); // try again.
var score:TextField = new TextField(); // score textfield
var result:TextField = new TextField(); // WIN of LOSE.
var format:TextFormat = new TextFormat();
var streak:Number;
var bonus:Number;
var klok:MovieClip = new clock();
var gameTimer:Timer = new Timer(1000,8);
var retry:Boolean = false; // dit duidt aan of het voor het eerst begint of dat het wordt geretried.
var win_timer:Timer;
//einde
public function main()
{
// dit maakt de startknop
startknop.x = 100;
startknop.y = 200;
startknop.buttonMode = true;
startknop.useHandCursor = true;
startknop.mouseChildren = false;
addChild(startknop);
addEventListener(MouseEvent.CLICK, startGame);
// einde
}
// deze code word opgeroepen om de game op te zetten en sommige variables goed in te stellen.
private function startGame(e:MouseEvent):void
{
gameTimer.reset();
result.text = "";
values = new Array(2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10);
bonus = 0;
streak = 0;
if (retry == false)
{
removeChild(startknop);
} else {
removeChild(tryAgain);
}
// score
score.x = 250;
score.y = 30;
score.width = 250;
score.selectable = false;
score.text = "Score: 0";
//score.
format.size = 40;
score.setTextFormat(format);
addChild(score);
// einde
// game klok
klok.x = 625;
klok.y = 100;
addChild(klok);
gameTimer.addEventListener(TimerEvent.TIMER_COMPLETE, lose);
gameTimer.addEventListener(TimerEvent.TIMER, tick);
gameTimer.start();
// einde
legKaarten();
removeEventListener(MouseEvent.CLICK,startGame);
}
// Hier worden de kaarten op het bord gelegd en krijgen ze een random variable.
private function legKaarten()
{
cardsRemoved = 0;
kaart1open = false;
kaart2open = false;
kaart1value = 0;
kaart2value = 0;
kaart1id = 0;
kaart2id = 0;
kaarten = new Array(); // je roept hier een lege Array(table) op.
for (var i:int = 0; i <= 17; i++ ) // (int)eger is een afgerond getal. ( geen decimalen)
{
var real:int = i;
var kolom:int = i;
var rij:int = 0;
kaarten.push(new Kaart1());
addChild(kaarten[i]);
kaarten[i].stop();
// hier worden de kolommen en rijen ingesteld.
if ( real > 5&&real <= 11)
{
rij++;
kolom = i - 6;
}
if ( real > 11)
{
rij = rij + 2;
kolom = i - 12;
}
//einde
var randIndex:int = Math.floor(Math.random() * (values.length - 1)) // hier worden de values geconfigureerd
kaarten[i].id = i;
kaarten[i].value = values[randIndex]; // dit geeft een kaart een random value uit de Array.
values.splice(randIndex, 1);
kaarten[i].x = 200+(kolom * 80);
kaarten[i].y = 100 + (rij * 150);
kaarten[i].width = 75;
kaarten[i].height = 125;
kaarten[i].addEventListener(MouseEvent.CLICK, omdraaien);
}
}
// deze functie draait de kaarten om om te kijken of de kaarten matchen.
private function omdraaien(e:MouseEvent):void
{
var geklikteKaart:MovieClip = e.currentTarget as MovieClip; //e.target is de klik target.
if (geklikteKaart.currentFrame == 1 && kaart1open == false)
{
if (kaart1open == false)
{
geklikteKaart.gotoAndStop(geklikteKaart.value);
kaart1open = true;
kaart1value = geklikteKaart.value;
kaart1id = geklikteKaart.id;
}
}
else if(geklikteKaart.currentFrame == 1 && kaart1open == true && kaart2open == false)
{
geklikteKaart.gotoAndStop(geklikteKaart.value);
kaart2open = true;
kaart2value = geklikteKaart.value;
kaart2id = geklikteKaart.id;
}
if (kaart1open == true && kaart2open == true && kaart1value == kaart2value)
{
pause_timer = new Timer(250, 1);
pause_timer.addEventListener(TimerEvent.TIMER_COMPLETE, removeKaarten);
pause_timer.start();
}
else if (kaart1open == true && kaart2open == true && kaart1value != kaart2value)
{
pause_timer = new Timer(250, 1);
pause_timer.addEventListener(TimerEvent.TIMER_COMPLETE, resetKaarten);
pause_timer.start();
}
}
private function removeKaarten(e:TimerEvent):void
{
removeChild(kaarten[kaart1id]);
removeChild(kaarten[kaart2id]);
streak ++;
cardsRemoved ++;
kaart1open = false;
kaart2open = false;
kaart1value = 0;
kaart2value = 0;
kaart1id = 0;
kaart2id = 0;
if (streak > 1)
{
bonus = bonus + 50;
}
if (cardsRemoved == 9)
{
gameTimer.stop();
win_timer = new Timer(500, 1);
win_timer.addEventListener(TimerEvent.TIMER_COMPLETE, win);
win_timer.start();
pause_timer.removeEventListener(TimerEvent.TIMER_COMPLETE, resetKaarten);
gameTimer.removeEventListener(TimerEvent.TIMER,tick);
}
else if (gameTimer.currentCount == 60)
{
gameTimer.removeEventListener(TimerEvent.TIMER,tick);
}
score.selectable = false;
score.text = "Score: " + (cardsRemoved * 100 + bonus);
format.size = 40;
score.setTextFormat(format);
//pause_timer.removeEventListener(TimerEvent.TIMER_COMPLETE, removeKaarten);
}
private function resetKaarten(e:TimerEvent):void
{
kaarten[kaart1id].gotoAndStop(1);
kaarten[kaart2id].gotoAndStop(1);
kaart1open = false;
kaart2open = false;
kaart1value = 0;
kaart2value = 0;
kaart1id = 0;
kaart2id = 0;
streak = 0;
pause_timer.removeEventListener(TimerEvent.TIMER_COMPLETE, resetKaarten);
}
private function tick(e:TimerEvent):void
{
klok.wijzer.rotation += 360 / gameTimer.repeatCount;
}
private function lose(e:TimerEvent):void
{
retry = true;
removeChild(klok);
removeChild(score);
// tekst voor verlies
result.x = 300;
result.y = 150;
result.width = 250;
result.selectable = false;
result.text = "YOU SUCK!";
format.size = 40;
result.setTextFormat(format);
addChild(result);
// einde
// dit maakt de try again knop.
tryAgain.x = 100;
tryAgain.y = 200;
tryAgain.buttonMode = true;
tryAgain.useHandCursor = true;
tryAgain.mouseChildren = false;
addChild(tryAgain);
addEventListener(MouseEvent.CLICK, startGame);
// einde
// hier worden de kaarten verwijderd.
for (var r:int = 0; r < 18; r++)
{
removeChild(kaarten[r]);
values.splice(kaarten[r], 1)
}
//einde
}
private function win(e:TimerEvent):void
{
retry = true;
removeChild(klok);
removeChild(score);
// tekst voor verlies
result.x = 200;
result.y = 150;
result.width = 550;
result.selectable = false;
result.text = "YOU ARE A WINNER!";
format.size = 40;
result.setTextFormat(format);
addChild(result);
// einde
// dit maakt de try again knop.
tryAgain.x = 100;
tryAgain.y = 200;
tryAgain.buttonMode = true;
tryAgain.useHandCursor = true;
tryAgain.mouseChildren = false;
addChild(tryAgain);
addEventListener(MouseEvent.CLICK, startGame);
// einde
// hier worden de kaarten verwijderd.
for (var r:int = 0; r < 18; r++)
{
if (kaarten[r].value != null)
{
removeChild(kaarten[r]);
values.splice(kaarten[r], 1)
}
}
//einde
}
}
}
When removing a DisplayObject from an DisplayObjectContainer you will get an error if the object you are trying to remove is null or not a child. You need to test for this.
The following example loops through the "karten" array, checks if each object exists and whether it's a child of this. If so, it removes the child, otherwise it does nothing before moving to the next item in the array.
for (var i:int = 0; i < kaarten.length; i++) {
if (kaarten[i] && this.contains(kaarten[i])) {
this.removeChild(kaarten[i]);
}
}