PDA

Volledige versie bekijken : game resetten


Raikko
%Europe/Berlin %760 %2010, 19:15
Hallo allemaal,

Voor school moet ik galgje maken in AS3. Ik ben hier redelijk nieuw in en het lukt wel aardig, op 1 ding na. En dat is het resetten van het spel. Het is ongetwijfeld vaker gevraagd maar ik kan er niet zo veel over vinden. Mijn vraag is dus hoe ik het spel kan resetten op het moment dat het woord geraden is of de galg compleet is.
Dit is mijn code:package{
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class galgje extends MovieClip{
//variablen
var galg : MovieClip;
var btn : MovieClip;
var streepje : MovieClip;
var letterFout : MovieClip;
var again : MovieClip;
var alfabet : Array = new Array("q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m");
var woorden : Array = new Array("pizza", "hallo", "parijs", "disney", "koekje", "galgje", "reizen", "saai", "slopen", "auto");
var letterGoed : Array = new Array();
var xpositie : int = 20;
var ypositie : int = 530;
var xpositie2 : int = 400;
var goed : int = 0;
var randomWoord : String;
var veldTF : TextField;
var fout : Boolean = true;
var TFcounter : int = 0;
var speelWeer : Boolean = false;
var foutGeweest : Boolean = false;

public function galgje(){
init();
}

private function init():void{
randomWoord = woorden[Math.floor(Math.random() * woorden.length)];
xpositie = 20;
ypositie = 530;

if(speelWeer == false){
galg = new Galg();
addChild(galg);
galg.x = 10;
galg.y = 100;
galg.stop();
}

//knoppen toetsenbord
for each (var letter:String in alfabet){
btn = new knopMC();
addChild(btn);
btn.veld.text = String(letter);
btn.x = xpositie += 70;
btn.y = ypositie;
if(letter == "p"){
xpositie = 50;
ypositie += 70;
}
else if(letter == "l"){
xpositie = 80;
ypositie += 70;
}
btn.addEventListener(MouseEvent.CLICK, klik);//functie aanroepen
btn.mouseChildren = false;
btn.buttonMode = true;
btn.value = letter;
}

//strepen zetten voor het aantal letters in woord
for(var item:int = 0; item<randomWoord.length; item++){;//lengte van het woord bepalen
streepje = new streepMC();
addChild(streepje);
streepje.x = 700 + (item * 30);
streepje.y = 340;
}

trace(randomWoord);
trace(randomWoord.length);
}

//functie bij klikken op knop
private function klik(evt:Event):void{
for(var i:int = 0; i < randomWoord.length; i++){ ;//i gebruik je voor de lengte van het woord, en de positie van de letter in het woord
//aparte TextFields genereren adh van aantal letters van het woord, in elk TF komt een aparte letter
veldTF = new TextField();
addChild(veldTF);
veldTF.x = 700 + (i * 30);
veldTF.y = 300;
veldTF.width = 25;
veldTF.height = 45;
TFcounter++;
//opmaak van TF
var opmaak : TextFormat = new TextFormat();
opmaak.size = 35;
veldTF.defaultTextFormat = opmaak;//opmaak aan TF 'hangen'

if (evt.target.value == randomWoord.charAt(i)){//als waarde van knop gelijk is aan waarde in array bij getal i voert ie dit uit
letterGoed[i] = (String(evt.target.value));//letters komen op juiste plek d.m.v. array
veldTF.text = (String(letterGoed[i]));//array wordt weergeven in TF's
fout = false;
goed++;
}
}
//als letter fout is, galg tekenen --> frame verder
if(fout == true){
letterFout = new foutMC;//MC met TF om te laten zien welke letters er al fout zijn geraden
addChild(letterFout);
letterFout.foutTF.text = evt.target.value; //foute letter in TF van MC zetten
letterFout.x = xpositie2;
letterFout.y = 450;
foutGeweest = true;
if(galg.totalFrames-1 != galg.currentFrame){//als huidige frame niet gelijk is aan totaal aantal frames, dan 1 frame verder
galg.nextFrame();
}
else{//als huidige frame wel gelijk is aan totaal aantal frames gaat ie terug naar 1 en blijft daar staan
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, overnieuw);
}
xpositie2 += 50;//x positie MC 50 bij doen, zodat de volgende foute letter ernaast komt te staan
}
fout = true;//fout weer op true zetten, anders blijft deze false als er een goede letter is geweest

//knop weghalen als er op is gedrukt zodat die niet meer gebruikt kan worden
removeChild(DisplayObject(evt.target));
//als lengte van de goed geraden letters gelijk is aan de lengte van het woord, dan naar functie gaan om overnieuw te beginnen
if(goed == randomWoord.length){
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, overnieuw);
}
}
private function overnieuw (e:Event):void{
removeChild(DisplayObject(again));
removeChild(DisplayObject(streepje));
removeChild(TextField(veldTF));
if(foutGeweest == true){
removeChild(DisplayObject(letterFout));
}
speelWeer = true;
foutGeweest == false;
galg.gotoAndStop(1);
}
}
}

Alvast bedankt!

mvg, Raikko

Dauntless
%Europe/Berlin %006 %2010, 01:08
Welkom op FlashFocus!

Er is geen standaard manier om iets te resetten. Je moet manueel al je acties ongedaan worden.

Dat is waarschijnlijk
- MovieClips verwijderen
- Timelines terug op hun start positie zetten
- Variabelen terug op hun begin waardes zetten.

sidar
%Europe/Berlin %128 %2010, 04:04
Opmerking:
var galg : MovieClip;
En vervolgens doe je
galg = new Galg();

je kunt dan beter
var galg : Galg;
doen =).

is wat netter.

Je script word ook makkelijker leesbaar als je je code opdeelt in functies. Zo houd je meer overzicht als je iets moet aanpassen, en is je script makkelijker te lezen.

functie namen zoals: "overnieuw" zijn niet echt duidelijk.
herstartSpel bijvoorbeeld klinkt meer als een activiteit/uitvoering is dus ook gepaster.

/rant =P

Raikko
%Europe/Berlin %353 %2010, 09:29
Opmerking:
var galg : MovieClip;
En vervolgens doe je
galg = new Galg();

je kunt dan beter
var galg : Galg;
doen =).

is wat netter.

Je script word ook makkelijker leesbaar als je je code opdeelt in functies. Zo houd je meer overzicht als je iets moet aanpassen, en is je script makkelijker te lezen.

functie namen zoals: "overnieuw" zijn niet echt duidelijk.
herstartSpel bijvoorbeeld klinkt meer als een activiteit/uitvoering is dus ook gepaster.

/rant =P

Ok, bedankt. Ik zal dit veranderen dan.

Welkom op FlashFocus!

Er is geen standaard manier om iets te resetten. Je moet manueel al je acties ongedaan worden.

Dat is waarschijnlijk
- MovieClips verwijderen
- Timelines terug op hun start positie zetten
- Variabelen terug op hun begin waardes zetten.

Zoiets dacht ik ook al ja, ik krijg het alleen niet voor elkaar om alle MovieClips te verwijderen. Dit komt waarschijnlijk doordat ze in een loop zijn gemaakt. Hierdoor wordt alleen de laatst aangemaakte MovieClip verwijderd....tips?

grtz

cornedor
%Europe/Berlin %433 %2010, 11:23
Zet de movieclips in een array:
for(var i:uint =0;i <=10; i++)
{
mc:MovieClip = new MovieClip();
array[i] = mc;
}
...
for(var i:uint =0;i <=10; i++)
{
array[i].removeChild();
} Let ook op dat je alle eventListeners verwijderd.

Raikko
%Europe/Berlin %728 %2010, 18:29
Zet de movieclips in een array:
for(var i:uint =0;i <=10; i++)
{
mc:MovieClip = new MovieClip();
array[i] = mc;
}
...
for(var i:uint =0;i <=10; i++)
{
array[i].removeChild();
} Let ook op dat je alle eventListeners verwijderd.

Ok, ik heb dat gedaan (de eventListeners nog niet maar dat komt nog)

en dan krijg ik deze foutmelding:
TypeError: Error #1009: Kan geen eigenschap of methode benaderen via een verwijzing naar een object dat null is.
at galgje/herstartSpel()

Nogmaals mijn code zoals die nu is:
package{
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class galgje extends MovieClip{
//variablen
var galg : MovieClip;
var btn : MovieClip;
var streepje : MovieClip;
var letterFout : MovieClip;
var again : MovieClip;
var alfabet : Array;
var woorden : Array;
var letterGoed : Array;
var btnArray : Array;
var streepArray : Array;
var tfArray : Array;
var foutArray : Array;
var xpositie : int;
var ypositie : int;
var btnCounter : int;
var xpositie2 : int;
var goed : int;
var foutLetter : int;
var randomWoord : String;
var veldTF : TextField;
var fout : Boolean;
var speelWeer : Boolean = false;
var foutGeweest : Boolean;

public function galgje(){
init();
}

private function init():void{
//parent.addChild(this);

if(speelWeer == false){//dit is om te voorkomen dat elke keer dat het spel gereset wordt, de galg opnieuw getekend wordt
galg = new Galg();
addChild(galg);
galg.x = 10;
galg.y = 100;
galg.stop();
}
else{
galg.gotoAndStop(1);
}

alfabet = new Array("q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m");
woorden = new Array("pizza", "hallo", "parijs", "disney", "koekje", "galgje", "reizen", "saai", "slopen", "auto");
randomWoord = woorden[Math.floor(Math.random() * woorden.length)];
xpositie = 20;
ypositie = 530;
xpositie2 = 400;
goed = 0;
foutLetter = 0;
fout = true;
foutGeweest = false;
letterGoed = new Array();
btnArray = new Array();
streepArray = new Array();
tfArray = new Array();
foutArray = new Array();
btnCounter = 0;

//knoppen toetsenbord
for each (var letter:String in alfabet){
btnArray[btnCounter] = btn;//MC btn word in array gezet
btn = new knopMC();//MC btn krijgt een MC
addChild(btn);//MC wordt op stage gezet
btn.veld.text = String(letter);
btn.x = xpositie += 70;
btn.y = ypositie;
if(letter == "p"){
xpositie = 50;
ypositie += 70;
}
else if(letter == "l"){
xpositie = 80;
ypositie += 70;
}
btn.addEventListener(MouseEvent.CLICK, klik);//functie aanroepen
btn.mouseChildren = false;
btn.buttonMode = true;
btn.value = letter;
btnCounter++;
}

//strepen zetten voor het aantal letters in woord
for(var item:int = 0; item<randomWoord.length; item++){;//lengte van het woord bepalen
streepje = new streepMC();
addChild(streepje);
streepje.x = 700 + (item * 30);
streepje.y = 340;
streepArray[item] = streepje;
}

trace(btnArray.length);
trace(streepArray.length);

trace(randomWoord);
trace(randomWoord.length);
}

//functie bij klikken op knop
private function klik(evt:Event):void{
for(var i:int = 0; i < randomWoord.length; i++){ ;//i gebruik je voor de lengte van het woord, en de positie van de letter in het woord
//aparte TextFields genereren adh van aantal letters van het woord, in elk TF komt een aparte letter
veldTF = new TextField();
addChild(veldTF);
veldTF.x = 700 + (i * 30);
veldTF.y = 300;
veldTF.width = 25;
veldTF.height = 45;
tfArray[i] = veldTF;
//opmaak van TF
var opmaak : TextFormat = new TextFormat();
opmaak.size = 35;
veldTF.defaultTextFormat = opmaak;//opmaak aan TF 'hangen'

if (evt.target.value == randomWoord.charAt(i)){//als waarde van knop gelijk is aan waarde in array bij getal i voert ie dit uit
letterGoed[i] = (String(evt.target.value));//letters komen op juiste plek d.m.v. array
veldTF.text = (String(letterGoed[i]));//array wordt weergeven in TF's
fout = false;
goed++;
}
}
//als letter fout is, galg tekenen --> frame verder
if(fout == true){
letterFout = new foutMC;//MC met TF om te laten zien welke letters er al fout zijn geraden
addChild(letterFout);
letterFout.foutTF.text = evt.target.value; //foute letter in TF van MC zetten
letterFout.x = xpositie2;
letterFout.y = 450;
foutArray[foutLetter] = letterFout;
foutLetter++;
foutGeweest = true;
if(galg.totalFrames-1 != galg.currentFrame){//als huidige frame niet gelijk is aan totaal aantal frames, dan 1 frame verder
galg.nextFrame();
}
else{//als huidige frame wel gelijk is aan totaal aantal frames gaat ie terug naar 1 en blijft daar staan
galg.nextFrame();
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
xpositie2 += 50;//x positie MC 50 bij doen, zodat de volgende foute letter ernaast komt te staan
}
fout = true;//fout weer op true zetten, anders blijft deze false als er een goede letter is geweest
//knop weghalen als er op is gedrukt zodat die niet meer gebruikt kan worden
removeChild(DisplayObject(evt.target));
//als lengte van de goed geraden letters gelijk is aan de lengte van het woord, dan naar functie gaan om overnieuw te beginnen
if(goed == randomWoord.length){
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
}

private function herstartSpel (e:Event):void{
trace(tfArray.length);
for(var i:int =0;i <alfabet.length; i++){
btnArray[i].removeChild();
}
for(var i2:int =0;i2 <randomWoord.length; i3++){
streepArray[i2].removeChild();
tfArray[i2].removeChild();
}
if(foutGeweest == true){
for(var i3:int = 0; i3 <=foutLetter; i3++){
foutArray[i3].removeChild();
}
}
speelWeer = true;
removeChild(DisplayObject(again));
init();
}
}
}

ideeën?

Grtz

Dauntless
%Europe/Berlin %732 %2010, 18:34
Je moet je button eerst aanmaken voordat je hem in een array kan stoppen he ;)
btn = new knopMC();//MC btn krijgt een MC
btnArray[btnCounter] = btn;//MC btn word in array gezet


En als je de buttonCounter enkel bijhoudt om de array te vullen, kan je ook gewoon array.push() gebruiken.

Raikko
%Europe/Berlin %746 %2010, 18:54
Je moet je button eerst aanmaken voordat je hem in een array kan stoppen he ;)
btn = new knopMC();//MC btn krijgt een MC
btnArray[btnCounter] = btn;//MC btn word in array gezet


En als je de buttonCounter enkel bijhoudt om de array te vullen, kan je ook gewoon array.push() gebruiken.

ok, alweer bedankt :P Als ik m nu run krijg ik:
ArgumentError: Error #1063: Verschil in aantal argumenten op flash.display::DisplayObjectContainer/removeChild(). Verwacht: 1, huidige waarde 0.
at galgje/herstartSpel()

en als ik dan 1, of this invul oid krijg ik:
TypeError: Error #1034: Afgedwongen typeomzetting is mislukt: kan 1 niet omzetten in flash.display.DisplayObject.
at galgje/herstartSpel()

Hoe kan dat dan weer opgelost worden?

Dauntless
%Europe/Berlin %754 %2010, 19:05
removeChild() werkt niet zoals removeMovieClip in AS2.

Je moet hem zo gebruiken:
container.removeChild(kind);

Dus eerder zo:
for(var i:int =0;i <alfabet.length; i++){
this.removeChild(btnArray[i]);
}
En waarom niet meteen over de array zelf loopen?
for(var i:int =0;i <btnArray.length; i++){
this.removeChild(btnArray[i]);
}

Raikko
%Europe/Berlin %757 %2010, 19:10
volgende foutmelding!!

ArgumentError: Error #2025: Het opgegeven DisplayObject moet een onderliggend item van de aanroeper zijn.
at flash.display::DisplayObjectContainer/removeChild()
at galgje/herstartSpel()

als ik dus dit stukje even eruit pak:
for(var i:int =0;i <btnArray.length; i++){
this.removeChild(btnArray[i]);
trace(btnArray.length);
}


dan krijg ik 8 keer 26 terug in de output van de trace...dit lijkt me niet helemaal te kloppen :S
ik ben je/jullie echt super dankbaar voor jullie hulp:P

Dauntless
%Europe/Berlin %762 %2010, 19:17
Die trace klopt wel. Het is niet omdat je de MovieClip van je scherm verwijdert, dat hij ook uit de array verwijderd wordt.

De fout is iets vreemder, omdat het voor zover ik zie wel klopt.
Zet voor je for loop eens:
trace(this);
trace(btnArray[0]);

Raikko
%Europe/Berlin %766 %2010, 19:23
trace(this); geeft: [object galgje]
trace(btnArray[0] geeft: [object knopMC]

Dauntless
%Europe/Berlin %784 %2010, 19:50
Mijn fout, dat geeft natuurlijk niet veel info :).

Je kan het alleszinds gewoon zo oplossen:
for(var i:int =0;i <btnArray.length; i++){
btnArray[i].parent.removeChild(btnArray[i]);
trace(btnArray.length);
}

Raikko
%Europe/Berlin %787 %2010, 19:53
er worden nu een paar MC's verwijderd, maar nog steeds niet alles. en ik krijg nog steeds deze foutmelding:
TypeError: Error #1009: Kan geen eigenschap of methode benaderen via een verwijzing naar een object dat null is.
at galgje/herstartSpel()

Dauntless
%Europe/Berlin %809 %2010, 20:26
Heb je de andere removeChilds() ook aangepast?

Laat je huidige code nog eens zien.

Raikko
%Europe/Berlin %812 %2010, 20:30
ja, hij komt niet eens aan die andere toe. Hij vliegt er bij de remove btn al uit....
package{
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class galgje extends MovieClip{
//variablen
var galg : MovieClip;
var btn : MovieClip;
var streepje : MovieClip;
var letterFout : MovieClip;
var again : MovieClip;
var alfabet : Array;
var woorden : Array;
var letterGoed : Array;
var btnArray : Array;
var streepArray : Array;
var tfArray : Array;
var foutArray : Array;
var xpositie : int;
var ypositie : int;
var xpositie2 : int;
var goed : int;
var randomWoord : String;
var veldTF : TextField;
var fout : Boolean;
var speelWeer : Boolean = false;
var foutGeweest : Boolean;

public function galgje(){
init();
}

private function init():void{
//parent.addChild(this);

if(speelWeer == false){//dit is om te voorkomen dat elke keer dat het spel gereset wordt, de galg opnieuw getekend wordt
galg = new Galg();
addChild(galg);
galg.x = 10;
galg.y = 100;
galg.stop();
}
else{
galg.gotoAndStop(1);
}

alfabet = new Array("q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m");
woorden = new Array("pizza", "hallo", "parijs", "disney", "koekje", "galgje", "reizen", "saai", "slopen", "auto");
randomWoord = woorden[Math.floor(Math.random() * woorden.length)];
xpositie = 20;
ypositie = 530;
xpositie2 = 400;
goed = 0;
fout = true;
foutGeweest = false;
letterGoed = new Array();
btnArray = new Array();
streepArray = new Array();
tfArray = new Array();
foutArray = new Array();

//knoppen toetsenbord
for each (var letter:String in alfabet){
btn = new knopMC();//MC btn krijgt een MC
addChild(btn);//MC wordt op stage gezet
btnArray.push(btn);//MC btn word in array gezet
btn.veld.text = String(letter);
btn.x = xpositie += 70;
btn.y = ypositie;
if(letter == "p"){
xpositie = 50;
ypositie += 70;
}
else if(letter == "l"){
xpositie = 80;
ypositie += 70;
}
btn.addEventListener(MouseEvent.CLICK, klik);//functie aanroepen
btn.mouseChildren = false;
btn.buttonMode = true;
btn.value = letter;
}

//strepen zetten voor het aantal letters in woord
for(var item:int = 0; item<randomWoord.length; item++){;//lengte van het woord bepalen
streepje = new streepMC();
addChild(streepje);
streepje.x = 700 + (item * 30);
streepje.y = 340;
streepArray.push(streepje);
}

/*trace(btnArray.length);
trace(streepArray.length);*/

trace(randomWoord);
//trace(randomWoord.length);
}

//functie bij klikken op knop
private function klik(evt:Event):void{
for(var i:int = 0; i < randomWoord.length; i++){ ;//i gebruik je voor de lengte van het woord, en de positie van de letter in het woord
//aparte TextFields genereren adh van aantal letters van het woord, in elk TF komt een aparte letter
veldTF = new TextField();
addChild(veldTF);
veldTF.x = 700 + (i * 30);
veldTF.y = 300;
veldTF.width = 25;
veldTF.height = 45;
tfArray.push(veldTF);
//opmaak van TF
var opmaak : TextFormat = new TextFormat();
opmaak.size = 35;
veldTF.defaultTextFormat = opmaak;//opmaak aan TF 'hangen'

if (evt.target.value == randomWoord.charAt(i)){//als waarde van knop gelijk is aan waarde in array bij getal i voert ie dit uit
letterGoed[i] = (String(evt.target.value));//letters komen op juiste plek d.m.v. array
veldTF.text = (String(letterGoed[i]));//array wordt weergeven in TF's
fout = false;
goed++;
}
}
//als letter fout is, galg tekenen --> frame verder
if(fout == true){
letterFout = new foutMC;//MC met TF om te laten zien welke letters er al fout zijn geraden
addChild(letterFout);
letterFout.foutTF.text = evt.target.value; //foute letter in TF van MC zetten
letterFout.x = xpositie2;
letterFout.y = 450;
foutArray.push(letterFout);
foutGeweest = true;
if(galg.totalFrames-1 != galg.currentFrame){//als huidige frame niet gelijk is aan totaal aantal frames, dan 1 frame verder
galg.nextFrame();
}
else{//als huidige frame wel gelijk is aan totaal aantal frames gaat ie terug naar 1 en blijft daar staan
galg.nextFrame();
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
xpositie2 += 50;//x positie MC 50 bij doen, zodat de volgende foute letter ernaast komt te staan
}
fout = true;//fout weer op true zetten, anders blijft deze false als er een goede letter is geweest
//knop weghalen als er op is gedrukt zodat die niet meer gebruikt kan worden
removeChild(DisplayObject(evt.target));
//als lengte van de goed geraden letters gelijk is aan de lengte van het woord, dan naar functie gaan om overnieuw te beginnen
if(goed == randomWoord.length){
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
}

private function herstartSpel (e:Event):void{
//trace(tfArray.length);
trace(this);
trace(btnArray[0]);
for(var i:int =0;i <= btnArray.length; i++){
btnArray[i].parent.removeChild(btnArray[i]);
trace(btnArray.length);
}
for(var i2:int =0;i2 <= streepArray.length; i3++){
streepArray[i2].parent.removeChild(streepArray[i2]);
tfArray.parent.removeChild(tfArray[i2]);
trace(streepArray.length);
trace(tfArray.length);
}
if(foutGeweest == true){
for(var i3:int = 0; i3 <= foutArray.length; i3++){
foutArray.parent.removeChild(foutArray[i3]);
trace(foutArray.length);
}
}
speelWeer = true;
removeChild(DisplayObject(again));
init();
}
}
}

EDIT: Hij haalt 8 knoppen weg, terwijl er 26 zijn. Maar volgens mij zitten ze dus niet alle 26 in de Array. Want hij verwijdert de 8 knoppen, en geeft dan de foutmelding dat het object null is. Maar hij loopt dus vast omdat de loop zich wel 26 keer herhaalt.... tot zover mijn probleem analyse. De oplossing weet ik niet :P

Dauntless
%Europe/Berlin %838 %2010, 21:07
Ze zouden er allemaal moeten inzitten hoor.

Kan je evt al je sources even online gooien in een zipje ?

Raikko
%Europe/Berlin %842 %2010, 21:12
hier zijn ze!

en het moet morgen avond ingeleverd worden. STRESS xD

Dauntless
%Europe/Berlin %854 %2010, 21:30
De for loop moet met <, niet <= . Anders krijg je een index die te groot is.

In de 2e for loop staat ook nog een removeChild te veel.

Dit is uiteraard ook fout:
for(var i2:int =0;i2 < streepArray.length; i3++){;(goed opletten)

En deze is ook nog fout:
for(var i3:int = 0; i3 < foutArray.length; i3++){;
foutArray.parent.removeChild(foutArray[i3]);
trace(foutArray.length);
}Deze moet zoals de anderen.

Als je die dingen corrigeert dan wordt er al een hele hoop gereset :)

Raikko
%Europe/Berlin %864 %2010, 21:44
Ik heb de dingen gedaan die je zei maar hou hetzelfde probleem....

De 2e removeChild in de 2e for loop is met opzet gedaan, want die moet ook verwijderd worden...

ik snap het ook niet meer hoor :S

Dauntless
%Europe/Berlin %896 %2010, 22:30
Je code ?

Raikko
%Europe/Berlin %292 %2010, 08:01
package{
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class galgje extends MovieClip{
//variablen
var galg : MovieClip;
var btn : MovieClip;
var streepje : MovieClip;
var letterFout : MovieClip;
var again : MovieClip;
var alfabet : Array;
var woorden : Array;
var letterGoed : Array;
var btnArray : Array;
var streepArray : Array;
var tfArray : Array;
var foutArray : Array;
var xpositie : int;
var ypositie : int;
var xpositie2 : int;
var goed : int;
var randomWoord : String;
var veldTF : TextField;
var fout : Boolean;
var speelWeer : Boolean = false;
var foutGeweest : Boolean;

public function galgje(){
init();
}

private function init():void{
//parent.addChild(this);

if(speelWeer == false){//dit is om te voorkomen dat elke keer dat het spel gereset wordt, de galg opnieuw getekend wordt
galg = new Galg();
addChild(galg);
galg.x = 10;
galg.y = 100;
galg.stop();
}
else{
galg.gotoAndStop(1);
}

alfabet = new Array("q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m");
woorden = new Array("pizza", "hallo", "parijs", "disney", "koekje", "galgje", "reizen", "saai", "slopen", "auto");
randomWoord = woorden[Math.floor(Math.random() * woorden.length)];
xpositie = 20;
ypositie = 530;
xpositie2 = 400;
goed = 0;
fout = true;
foutGeweest = false;
letterGoed = new Array();
btnArray = new Array();
streepArray = new Array();
tfArray = new Array();
foutArray = new Array();

//knoppen toetsenbord
for each (var letter:String in alfabet){
btn = new knopMC();//MC btn krijgt een MC
addChild(btn);//MC wordt op stage gezet
btnArray.push(btn);//MC btn word in array gezet
btn.veld.text = String(letter);
btn.x = xpositie += 70;
btn.y = ypositie;
if(letter == "p"){
xpositie = 50;
ypositie += 70;
}
else if(letter == "l"){
xpositie = 80;
ypositie += 70;
}
btn.addEventListener(MouseEvent.CLICK, klik);//functie aanroepen
btn.mouseChildren = false;
btn.buttonMode = true;
btn.value = letter;
}

//strepen zetten voor het aantal letters in woord
for(var item:int = 0; item<randomWoord.length; item++){;//lengte van het woord bepalen
streepje = new streepMC();
addChild(streepje);
streepje.x = 700 + (item * 30);
streepje.y = 340;
streepArray.push(streepje);
}

/*trace(btnArray.length);
trace(streepArray.length);*/

trace(randomWoord);
//trace(randomWoord.length);
}

//functie bij klikken op knop
private function klik(evt:Event):void{
for(var i:int = 0; i < randomWoord.length; i++){ ;//i gebruik je voor de lengte van het woord, en de positie van de letter in het woord
//aparte TextFields genereren adh van aantal letters van het woord, in elk TF komt een aparte letter
veldTF = new TextField();
addChild(veldTF);
veldTF.x = 700 + (i * 30);
veldTF.y = 300;
veldTF.width = 25;
veldTF.height = 45;
tfArray.push(veldTF);
//opmaak van TF
var opmaak : TextFormat = new TextFormat();
opmaak.size = 35;
veldTF.defaultTextFormat = opmaak;//opmaak aan TF 'hangen'

if (evt.target.value == randomWoord.charAt(i)){//als waarde van knop gelijk is aan waarde in array bij getal i voert ie dit uit
letterGoed[i] = (String(evt.target.value));//letters komen op juiste plek d.m.v. array
veldTF.text = (String(letterGoed[i]));//array wordt weergeven in TF's
fout = false;
goed++;
}
}
//als letter fout is, galg tekenen --> frame verder
if(fout == true){
letterFout = new foutMC;//MC met TF om te laten zien welke letters er al fout zijn geraden
addChild(letterFout);
letterFout.foutTF.text = evt.target.value; //foute letter in TF van MC zetten
letterFout.x = xpositie2;
letterFout.y = 450;
foutArray.push(letterFout);
foutGeweest = true;
if(galg.totalFrames-1 != galg.currentFrame){//als huidige frame niet gelijk is aan totaal aantal frames, dan 1 frame verder
galg.nextFrame();
}
else{//als huidige frame wel gelijk is aan totaal aantal frames gaat ie terug naar 1 en blijft daar staan
galg.nextFrame();
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
xpositie2 += 50;//x positie MC 50 bij doen, zodat de volgende foute letter ernaast komt te staan
}
fout = true;//fout weer op true zetten, anders blijft deze false als er een goede letter is geweest
//knop weghalen als er op is gedrukt zodat die niet meer gebruikt kan worden
removeChild(DisplayObject(evt.target));
//als lengte van de goed geraden letters gelijk is aan de lengte van het woord, dan naar functie gaan om overnieuw te beginnen
if(goed == randomWoord.length){
again = new againMC;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
}

private function herstartSpel (e:Event):void{
//trace(tfArray.length);
trace(this);
trace(btnArray);
for(var i:int =0;i < btnArray.length; i++){
//Stage.btn.parent.removechild()
btnArray[i].parent.removeChild(btnArray[i]);
trace(btnArray.length);
}
for(var i2:int =0;i2 < streepArray.length; i2++){
streepArray[i2].parent.removeChild(streepArray[i2]);
tfArray.parent.removeChild(tfArray[i2]);
trace(streepArray.length);
trace(tfArray.length);
}
if(foutGeweest == true){
for(var i3:int = 0; i3 < foutArray.length; i3++){
foutArray[i3].parent.removeChild(foutArray[i3]);
trace(foutArray.length);
}
}
speelWeer = true;
removeChild(DisplayObject(again));
init();
}
}
}

Ik blijf erbij dat het volgens mij niet klopt dat trace(btnArray.length); maar 8 keer een output geeft....

Dauntless
%Europe/Berlin %332 %2010, 08:59
package
{
import flash.display.*;
import flash.text.*;
import flash.events.*;

public class galgje extends MovieClip
{
//variablen
var galg:MovieClip;
var btn:MovieClip;
var streepje:MovieClip;
var letterFout:MovieClip;
var again:MovieClip;
var alfabet:Array;
var woorden:Array;
var letterGoed:Array;
var btnArray:Array;
var streepArray:Array;
var tfArray:Array;
var foutArray:Array;
var xpositie:int;
var ypositie:int;
var xpositie2:int;
var goed:int;
var randomWoord:String;
var veldTF:TextField;
var fout:Boolean;
var speelWeer:Boolean = false;
var foutGeweest:Boolean;

public function galgje()
{
init();
}

private function init():void
{
//parent.addChild(this);
if (speelWeer == false)
{//dit is om te voorkomen dat elke keer dat het spel gereset wordt, de galg opnieuw getekend wordt
galg = new Galg();
addChild(galg);
galg.x = 10;
galg.y = 100;
galg.stop();
}
else
{
galg.gotoAndStop(1);
}

alfabet = new Array("q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m");
woorden = new Array("pizza","hallo","parijs","disney","koekje","galgje","reizen","saai","slopen","auto");
randomWoord = woorden[Math.floor(Math.random() * woorden.length)];
xpositie = 20;
ypositie = 530;
xpositie2 = 400;
goed = 0;
fout = true;
foutGeweest = false;
letterGoed = new Array();
btnArray = new Array();
streepArray = new Array();
tfArray = new Array();
foutArray = new Array();

//knoppen toetsenbord
for each (var letter:String in alfabet)
{
btn = new knopMC();//MC btn krijgt een MC
addChild(btn);//MC wordt op stage gezet
btnArray.push(btn);
trace(btnArray);
//MC btn word in array gezet;
btn.veld.text = String(letter);
btn.x = xpositie += 70;
btn.y = ypositie;
if (letter == "p")
{
xpositie = 50;
ypositie += 70;
}
else if (letter == "l")
{
xpositie = 80;
ypositie += 70;
}
btn.addEventListener(MouseEvent.CLICK, klik);
//functie aanroepen;
btn.mouseChildren = false;
btn.buttonMode = true;
btn.value = letter;
}

//strepen zetten voor het aantal letters in woord
for(var item:int = 0; item<randomWoord.length; item++){;
streepje = new streepMC();
addChild(streepje);
streepje.x = 700 + (item * 30);
streepje.y = 340;
streepArray.push(streepje);
}

trace(btnArray);
/*trace(btnArray.length);
trace(streepArray.length);*/

trace(randomWoord);
//trace(randomWoord.length);
}

//functie bij klikken op knop
private function klik(evt:Event):void
{
for(var i:int = 0; i < randomWoord.length; i++){ ;//i gebruik je voor de lengte van het woord, en de positie van de letter in het woord
//aparte TextFields genereren adh van aantal letters van het woord, in elk TF komt een aparte letter
veldTF = new TextField();
addChild(veldTF);
veldTF.x = 700 + (i * 30);
veldTF.y = 300;
veldTF.width = 25;
veldTF.height = 45;
tfArray.push(veldTF);
//opmaak van TF;
var opmaak : TextFormat = new TextFormat();
opmaak.size = 35;
veldTF.defaultTextFormat = opmaak;//opmaak aan TF 'hangen'

if (evt.target.value == randomWoord.charAt(i))
{//als waarde van knop gelijk is aan waarde in array bij getal i voert ie dit uit
letterGoed[i] = (String(evt.target.value));//letters komen op juiste plek d.m.v. array
veldTF.text = (String(letterGoed[i]));//array wordt weergeven in TF's
fout = false;
goed++;
}
}
//als letter fout is, galg tekenen --> frame verder
if (fout == true)
{
letterFout = new foutMC ;//MC met TF om te laten zien welke letters er al fout zijn geraden
addChild(letterFout);
letterFout.foutTF.text = evt.target.value;//foute letter in TF van MC zetten
letterFout.x = xpositie2;
letterFout.y = 450;
foutArray.push(letterFout);
foutGeweest = true;
if (galg.totalFrames - 1 != galg.currentFrame)
{//als huidige frame niet gelijk is aan totaal aantal frames, dan 1 frame verder
galg.nextFrame();
}
else
{//als huidige frame wel gelijk is aan totaal aantal frames gaat ie terug naar 1 en blijft daar staan
galg.nextFrame();
again = new againMC ;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
xpositie2 += 50;//x positie MC 50 bij doen, zodat de volgende foute letter ernaast komt te staan
}
fout = true;//fout weer op true zetten, anders blijft deze false als er een goede letter is geweest
//knop weghalen als er op is gedrukt zodat die niet meer gebruikt kan worden
removeChild(DisplayObject(evt.target));
//als lengte van de goed geraden letters gelijk is aan de lengte van het woord, dan naar functie gaan om overnieuw te beginnen
if (goed == randomWoord.length)
{
again = new againMC ;
addChild(again);
again.x = 100;
again.y = 100;
again.buttonMode = true;
again.mouseChildren = false;
again.addEventListener(MouseEvent.CLICK, herstartSpel);
}
}

private function herstartSpel(e:Event):void
{
//trace(tfArray.length);

for(var i:int =0;i < btnArray.length; i++){;
//Stage.btn.parent.removechild()
trace(btnArray[i].veld.text);
if(btnArray[i].parent) btnArray[i].parent.removeChild(btnArray[i]);
//trace(btnArray.length);
}
for(var i2:int =0;i2 < streepArray.length; i2++){;
streepArray[i2].parent.removeChild(streepArray[i2]);


trace(streepArray.length);
trace(tfArray.length);
}

for(i = 0; i<tfArray.length; i++)
{
tfArray[i].parent.removeChild(tfArray[i]);

}



if (foutGeweest == true)
{
for(var i3:int = 0; i3 < foutArray.length; i3++){;
foutArray[i3].parent.removeChild(foutArray[i3]);
trace(foutArray.length);
}
}
speelWeer = true;
removeChild(DisplayObject(again));
init();
}
}
}

Raikko
%Europe/Berlin %376 %2010, 10:01
YEAH HIJ DOET HET!!

kan je me uitleggen waarom ie t nu wel doet? Ik ga zo'n vraag namelijk krijgen denk ik xD

Echt super bedankt man!

Dauntless
%Europe/Berlin %379 %2010, 10:06
Voor elke array een aparte for loop en dan deze:
if(btnArray[i].parent) btnArray[i].parent.removeChild(btnArray[i]);
Aangezien je de letters verwijdert ipv gewoon onzichtbaar maakt, zijn sommige letters al verwijderd en hebben ze dus geen .parent meer (en kunnen ze dus niet nog eens verwijderd worden).

Raikko
%Europe/Berlin %400 %2010, 10:36
Voor elke array een aparte for loop en dan deze:
if(btnArray[i].parent) btnArray[i].parent.removeChild(btnArray[i]);
Aangezien je de letters verwijdert ipv gewoon onzichtbaar maakt, zijn sommige letters al verwijderd en hebben ze dus geen .parent meer (en kunnen ze dus niet nog eens verwijderd worden).

klinkt logisch :P .parent is dus zeg maar de root van de MC? of hoe moet ik dat zien...

Dauntless
%Europe/Berlin %401 %2010, 10:37
.parent is de ... parent van de movieclip :p. De vader dus. Als x de parent is van y, dan is y een element van x. Als x de parent is van y en y de parent van z, dan zit z in y en y in x.

Het is dezelfde 'parent' als diegene die in bomen gebruikt wordt.

Raikko
%Europe/Berlin %404 %2010, 10:42
klinkt nog steeds logisch :P xD

Maar waarom moet je dat op deze manier doen? btnArray[i].parent.removeChild(btnArray[i]);

waarom voor de parent btnArray en na removeChild nog een keer?

Dauntless
%Europe/Berlin %447 %2010, 11:44
Waarschijnlijk gaat dit ook gewoon:
this.removeChild(btnArray[i]); omdat this == btnArray[i].parent.

Het formaat is altijd:
parent.removeChild(child);

Als je er dus zeker van wil zijn dat parent wel echt de parent van child is, doe je natuurlijk child.parent: child.parent.removeChild(child);

Raikko
%Europe/Berlin %684 %2010, 17:25
ok, helder en duidelijk.

Nogmaals super bedankt!