I don't program a lot. Sometimes I program a bit of Actionscript 3. Now I wanted to create an flash enviroment where people can click on buttons and play a video. I think I almost figured it out with the following script:
public class main extends MovieClip
{
private var drukknop1:knopje;
private var drukknop2:knopje;
private var drukknop3:knopje;
private var drukknop4:knopje;
private var drukknop5:knopje;
private var drukknop6:knopje;
private var drukknop7:knopje;
private var drukknop8:knopje;
private var drukknop9:knopje;
private var drukknop10:knopje;
private var videoclip:FLVPlayback = new FLVPlayback();
private var buttonClicked:Number = 0;
public function main()
{
// plaatsen van buttons on stage
drukknop1 = new knopje();
drukknop1.name = "inst_knop1";
drukknop1.x = 50;
drukknop1.y = 70;
addChild(drukknop1);
drukknop1.buttonMode = true;
drukknop1.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop1.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop2 = new knopje();
drukknop2.name = "inst_knop2";
drukknop2.x = 150;
drukknop2.y = 70;
addChild(drukknop2);
drukknop2.buttonMode = true;
drukknop2.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop2.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop3 = new knopje();
drukknop3.name = "inst_knop3";
drukknop3.x = 250;
drukknop3.y = 70;
addChild(drukknop3);
drukknop3.buttonMode = true;
drukknop3.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop3.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop4 = new knopje();
drukknop4.name = "inst_knop4";
drukknop4.x = 350;
drukknop4.y = 70;
addChild(drukknop4);
drukknop4.buttonMode = true;
drukknop4.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop4.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop5 = new knopje();
drukknop5.name = "inst_knop5";
drukknop5.x = 450;
drukknop5.y = 70;
addChild(drukknop5);
drukknop5.buttonMode = true;
drukknop5.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop5.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop6 = new knopje();
drukknop6.name = "inst_knop6";
drukknop6.x = 550;
drukknop6.y = 70;
addChild(drukknop6);
drukknop6.buttonMode = true;
drukknop6.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop6.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop7 = new knopje();
drukknop7.name = "inst_knop7";
drukknop7.x = 650;
drukknop7.y = 70;
addChild(drukknop7);
drukknop7.buttonMode = true;
drukknop7.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop7.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop8 = new knopje();
drukknop8.name = "inst_knop8";
drukknop8.x = 750;
drukknop8.y = 70;
addChild(drukknop8);
drukknop8.buttonMode = true;
drukknop8.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop8.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop9 = new knopje();
drukknop9.name = "inst_knop9";
drukknop9.x = 850;
drukknop9.y = 70;
addChild(drukknop9);
drukknop9.buttonMode = true;
drukknop9.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop9.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
drukknop10 = new knopje();
drukknop10.name = "inst_knop10";
drukknop10.x = 950;
drukknop10.y = 70;
addChild(drukknop10);
drukknop10.buttonMode = true;
drukknop10.addEventListener(MouseEvent.MOUSE_UP, _flv_component);
drukknop10.addEventListener(MouseEvent.MOUSE_DOWN, ButtonClicked);
}
private function _flv_component(event:MouseEvent):void
{
//plaatsen van de video player door drukken op de knop
drukknop1.buttonMode = false;
drukknop1.removeEventListener(MouseEvent.MOUSE_UP, _flv_component);
videoclip.x = (stage.stageWidth/2)-(videoclip.width/2);
videoclip.y = (stage.stageHeight/2)-(videoclip.height/2);
videoclip.width = 640;
videoclip.height = 400;
videoclip.autoPlay = true;
videoclip.skin = "MinimaSilverPlayBackSeekMute.swf";
if(buttonClicked ==1)
{videoclip.load("Functieomschrijvingscene.flv");}
else if(buttonClicked ==2)
{videoclip.load("2.flv");}
else if(buttonClicked ==3)
{videoclip.load("3.flv");}
else if(buttonClicked ==4)
{videoclip.load("4.flv");}
else if(buttonClicked ==5)
{videoclip.load("5.flv");}
else if(buttonClicked ==6)
{videoclip.load("6.flv");}
else if(buttonClicked ==7)
{videoclip.load("7.flv");}
else if(buttonClicked ==8)
{videoclip.load("8.flv");}
else if(buttonClicked ==9)
{videoclip.load("9.flv");}
else if(buttonClicked ==10)
{videoclip.load("10.flv");}
videoclip.play();
addChild(videoclip);
videoclip.addEventListener(Event.COMPLETE,videoComplete);
}
function videoComplete(event:Event):void
{
//Verwijderen van FLVPlayback component
trace ("video is klaar");
removeChild(videoclip);
buttonClicked = 0;
trace (buttonClicked);
}
function ButtonClicked(Event:MouseEvent):void
{
trace ("ButtonClicked functie werkt.");
trace (buttonClicked);
// het opslaan van een nummer van een button
if(event.target.name == drukknop1)
{buttonClicked = 1;}
else if(event.target.name == drukknop2)
{buttonClicked = 2;}
else if(event.target.name == drukknop3)
{buttonClicked = 3;}
else if(event.target.name == drukknop4)
{buttonClicked = 4;}
else if(event.target.name == drukknop5)
{buttonClicked = 5;}
else if(event.target.name == drukknop6)
{buttonClicked = 6;}
else if(event.target.name == drukknop7)
{buttonClicked = 7;}
else if(event.target.name == drukknop8)
{buttonClicked = 8;}
else if(event.target.name == drukknop9)
{buttonClicked = 9;}
else if(event.target.name == "inst_knop10")
{buttonClicked = 10;}
}
}
}
In the function "ButtonClicked, I want to check which button is clicked. After that I want to store a value in the private var "Buttonclicked" So that based on this number I know which FLV needs to be loaded. But when I export I get an error "Access of Undefined property event". This probably has got to do with my "If" statement in the functions but I have no clue on how to solve this.
Could someone please help me out? I know programming with classes would be much neater, but I have to little experience in this.
Thanks in advance,
Harold
You got that error because for your ButtonClicked() function you've declared an MouseEvent object called Event and inside the function you've used event, I think it's just a typing mistake.
So your function can be like this :
function ButtonClicked(event:MouseEvent):void
{
// ...
}
Also, I remarked in your code that you've written a lot of code to do something really easy and don't need all that code. Don't forget that when you are repeating the same thing n times (10 times for your case), that you are doing something wrong and that you should (can) optimize that. You can use a function, for example, to do that repeated task ...
For that, take this example :
package {
import flash.display.MovieClip;
import flash.events.MouseEvent;
import flash.events.Event;
public class Main extends MovieClip {
private const BUTTONS_NUM:int = 10;
private const BOTTONS_Y:int = 70;
private const BUTTONS_SUFFIX:String = 'inst_knop';
private const VIDEOS:Array = ['1.flv', '2.flv', '3.flv', '4.flv', '5.flv', '6.flv', '7.flv', '8.flv', '9.flv', '10.flv'];
public function Main()
{
// initialize the FLVPlayback component inserted in the stage
videoclip.width = 640;
videoclip.height = 400;
videoclip.autoPlay = true;
videoclip.addEventListener(Event.COMPLETE,videoComplete);
createButtons();
}
private function createButtons(): void
{
for(var i:int = 0; i < BUTTONS_NUM; i++){
var button:knopje = new knopje();
button.name = BUTTONS_SUFFIX + (i+1);
button.x = i*100 + 50;
button.y = BOTTONS_Y;
button.buttonMode = true;
button.addEventListener(MouseEvent.CLICK, playVideo);
addChild(button);
}
}
private function playVideo(event:MouseEvent):void
{
// get button's index, for example : 7 for the button called "inst_knop7"
var button_index:int = int((event.currentTarget.name).substr(BUTTONS_SUFFIX.length)) - 1;
// play the video
videoclip.play('video/' + VIDEOS[button_index]);
}
private function videoComplete(event:Event):void
{
trace('end of the video.');
}
}
}
Hope that can help.
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();
}
}
}
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]);
}
}