[AS3]vervanger voor while loop om continuiteit te garanderen

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ebborazor
  • Registratie: Maart 2002
  • Laatst online: 10-09-2022
Dag,

Ik vermaak me al een week of twee behoorlijk met actionscript en flash CS. Hiervoor had ik al wat c++ tutorials gedaan maar ik kwam er al snel achter dat ik nog behoorlijk lang in het console window zou moeten blijven klooien voordat ik (grafisch) wat op het scherm zou kunnen gooien. En toen hoorde ik dus van actionscript en tot nu toe bevalt het goed.
Ik speel met het idee om later (als ik groot ben en) de taal wat meer onder de knie heb een soort van corsairs remake te maken. Een spel uit de jaren negentig waarin je als piraat in de Cariben(thanks spellcheck) kon huis houden. Het is perspectief is topdown dus ik dacht; laat ik wat met een coordinaten systeem gaan doen. Ik ben een echte alfa en heb dus alleen maar wiskunde a1 en a2 gedaan (zo heette dat toch?) dus mij leek het ook geen slecht idee om mijn wiskundige kennis wat op te frissen (soscastoa enzo). En na 2 middagen is dit er uit komen rollen:

http://megaswf.com/view/2...4ee939bb9d94ee5c6b4c.html

Al met al geen slecht resultaat maar toch ontbreken er een aantal dingen. Zo zal zonder twijfel de grootste feature die aan versie 2.5 toegevoegd gaat worden een reset knop zijn. En daar stuitte ik dus op het eerste niet door mijzelf op te lossen probleem.
De reset knop zelf is al klaar en ook de functie die ik via een eventlistener aan de knop heb gekoppeld is voor het grootste gedeelte al af.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function resetGraph(evt:MouseEvent):void {
    
    //kill childs >:)
    removeChild(this.dot_one);
    removeChild(this.dot_two);
    removeChild(this.cross);
    removeChild(this.line_one);
    removeChild(this.line_two);
    removeChild(this.line_three);
    removeChild(this.cText);
    
    //kill events
    reset.removeEventListener(MouseEvent.CLICK, resetGraph);
    mouseField.removeEventListener(MouseEvent.MOUSE_MOVE, displayMouse);
    mouseField.removeEventListener(MouseEvent.CLICK, getInput);

    //reset counter
    test = 0;
    
    //restart program <--- ?
    
    
}


Als ik nu versie 2.5 draai is er in principe niets aan de hand. Maar als ik op reset druk nadat de grafiek geplot is verdwijnen alle movieClips wel van het scherm, het probleem is, dat ze nu dan ook echt weg zijn.
In c++ kon er met een simpel while ( !true) loopje er voorzorgen dat wanneer het programma het eind had bereikt weer terug naar het begin ging. In flash lijkt dit geen oplossing te zijn want zodra ik dat probeer krijg ik meteen een timeout door de debugger om mijn oren gesmeten. Mijn vraag is dus nu, hoe zorg ik ervoor in as3 dat mijn programma na een keer helemaal gedraaid te hebben weer terug gaat naar het begin. (voor de goede orde, ik heb het hier niet over frames maar simpelweg weer terug naar het begin van de code in het .as bestand)

TIA!

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:49

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nou heb ik zelf totaal geen ervaring met Flash of AS, maar met het event-driven model wat Flash ongetwijfeld aanhoudt gok ik dat je iets met een timer event oid moet doen. Heb je zoiets als Javascript's setTimeout() oid? Of wellicht is er een timer object die elke keer een functie aanroept? De inhoud van die lus komt dan in die functie zeg maar.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Ik ben heel nieuwsgierig hoe je init class of functie eruit ziet :)

Als ik het goed begrijp wil je na de reset gewoon terug naar de beginstand van je swf right?

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Acties:
  • 0 Henk 'm!

  • Bozozo
  • Registratie: Januari 2005
  • Laatst online: 20-02 16:10

Bozozo

Your ad here?

Je kunt niet "terug naar het begin". Je moet gewoon je code netjes schrijven, zodat het mogelijk is om je objecten allemaal te vernietigen en opnieuw aan te maken. Dan kun je zoiets doen:

code:
1
2
3
4
5
6
7
8
9
10
initMap() {
  //make stuff
}
closeMap() {
  //destroy stuff
}
resetMap {
  closeMap();
  initMap();
}


Succes ermee :)

TabCinema : NiftySplit


Acties:
  • 0 Henk 'm!

  • ebborazor
  • Registratie: Maart 2002
  • Laatst online: 10-09-2022
Bozozo schreef op donderdag 04 december 2008 @ 14:19:
Je kunt niet "terug naar het begin". Je moet gewoon je code netjes schrijven, zodat het mogelijk is om je objecten allemaal te vernietigen en opnieuw aan te maken. Dan kun je zoiets doen:

code:
1
2
3
4
5
6
7
8
9
10
initMap() {
  //make stuff
}
closeMap() {
  //destroy stuff
}
resetMap {
  closeMap();
  initMap();
}


Succes ermee :)
Ik had inderdaad al geprobeerd om de functie waarin de events en childs gemaakt worden in de functie te callen(?) waarin de events en childs verwijderd worden. Het probleem waar ik hier op stuitte was (ik denk door de scope van de functie) de andere functies niks meer met de movieClips konden doen. Dus, in het geval van jouw voorbeeld kon ik vanuit resetMap() de movieclips en events die ik in de initMap() creerde niet bereiken.

Dan toch maar de hele code om het iets duidelijker te maken:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
        //public vars
        var x_one:Number;
        var y_one:Number;
        var x_two:Number;
        var y_two:Number;
        
        
        var quit:Boolean = false;
        
            var dot_one:MovieClip = new dotGraphic();
            var dot_two:MovieClip = new dotGraphic();       
            var cross:MovieClip = new Cross();      
            var line_one:MovieClip = new Line_One();
            var line_two:MovieClip = new Line_Two();
            var line_three:MovieClip = new Line_Two();
            var cText:MovieClip = new coordsText();
            var reset:SimpleButton = new Reset();
            addChild(dot_one);
            addChild(dot_two);
            addChild(cross);
            addChild(line_one);
            addChild(line_two);
            addChild(line_three);
            addChild(cText);
            cText.x = 425;
            cText.y = 130;
            addChild(reset)
            reset.x = 380;
            reset.y = 287;
            
            
        
    

        
        //events
        mouseField.addEventListener(MouseEvent.MOUSE_MOVE, displayMouse, false, 0, true);
        mouseField.addEventListener(MouseEvent.CLICK, getInput, false, 0, true);
        x.addEventListener(
        reset.addEventListener(MouseEvent.CLICK, resetGraph, false, 0, true);
        
        
        
        
        
        
        
    

function randRange(min:Number, max:Number):Number {
    var randomNum:Number = Math.floor(Math.random() * (max - min + 1)) + min;
    return randomNum;
}


function displayMouse(evt:MouseEvent):void {
    cText.text_coordsMouse.text = mouseField.mouseX + " : " +mouseField.mouseY;
}




var test:Number = 0;

function getInput(evt:MouseEvent):void {
    
    if(test == 0) {
        x_one = mouseField.mouseX;
        y_one = mouseField.mouseY;
        dot_one.x = x_one + 100;
        dot_one.y = y_one + 100;
        dot_one.myCoords.text = "I";
        cText.text_coordsOne.text = "I : " + x_one + " , " + y_one;
        test++;
        
        
        
    }//end if
    else if(test == 1) {
        x_two = mouseField.mouseX;
        y_two = mouseField.mouseY;
        dot_two.x = x_two + 100;
        dot_two.y = y_two + 100;
        dot_two.myCoords.text = "II";
        cText.text_coordsTwo.text = "II: " + x_two + " , " + y_two;
        test++;
    }// end else if
    else {
                
        drawLines();
                    
        }//end else
        
        
        
        
        
}//end function

function drawLines(){
    var x_cross = x_one;
    var y_cross = y_two;
    cross.x = x_one + 100;
    cross.y = y_two + 100;
    cross.myCoords.text = "x"
    cText.text_coordsCross.text = "x : " + x_one + " , " + y_two;
    
    
    if(x_one > x_two){
    var length_x = (x_one - x_two);
    }
    else{
    length_x = (x_two - x_one);
    }
    
    if(y_one > y_two){
    var length_y = (y_one - y_two);
    }
    else{
    length_y = (y_two - y_one);
    }
        
    var a1 = Math.pow(length_x , 2);//a2+b2 =c3
    var a2 = Math.pow(length_y , 2);
    var a3 = a1 + a2;
    var length_z =  Math.sqrt(a3);
    
    var angleRadians = Math.asin((length_y/length_z));
    var angleDegrees = angleRadians*(180/Math.PI);
    
    cText.text_angleOne.text = "&#945; = " + Math.round(angleDegrees) + "°";
    cText.text_angleTwo.text = "&#946; = " + Math.round((90-angleDegrees)) + "°";
    cText.text_distanceAB.text = "I -> II = " + Math.round(length_z);
    setChildIndex(line_one, 1);
    setChildIndex(line_two, 1);
    setChildIndex(line_three, 1);
    
    line_one.x = x_one +100;
    line_one.y = y_one +100;
    line_two.x = x_two +100;
    line_two.y = y_two +100;
    line_three.x = x_one +100;
    line_three.y = y_one +100;
        
    if(y_one > y_two) {
        line_one.height = y_one - y_two;
        line_one.rotation = 180;
    }// end if
    else {
        line_one.height = y_two - y_one;
        line_one.rotation = 0;
    }// end else
    
    if(x_two > x_one) {
        line_two.width = x_two - x_one;
        line_two.rotation = 180;
    }// end if
    else {
        line_two.width = x_one - x_two;
    }// end else
    
    line_three.width = length_z;

    
    if(y_one > y_two) {
        
        if((x_one) > (x_two)) {
        line_three.rotation = 180 + angleDegrees;
        
        }//end if
        else {
        line_three.rotation = -angleDegrees;
        }//end else
    }// end if
    else {
    
        if(x_one > x_two) {
        line_three.rotation = 180 - angleDegrees;
        }// end if
        else {
        line_three.rotation = angleDegrees;
        }// end else
        
    }//end else

    
}

        
function resetGraph(evt:MouseEvent):void {
    
    //kill childs >:)
    removeChild(this.dot_one);
    removeChild(this.dot_two);
    removeChild(this.cross);
    removeChild(this.line_one);
    removeChild(this.line_two);
    removeChild(this.line_three);
    removeChild(this.cText);
    
    //kill events
    reset.removeEventListener(MouseEvent.CLICK, resetGraph);
    mouseField.removeEventListener(MouseEvent.MOUSE_MOVE, displayMouse);
    mouseField.removeEventListener(MouseEvent.CLICK, getInput);

    //reset counter
    test = 0;
    
    //restart program
    
    
}


Zoals je ziet is de code nogal rommelig en misschien is het geen slecht idee om het programma maar gewoon helemaal overnieuw te schrijven. Ik zit dit weekend in Londen dus ben maandag pas weer terug. Iig bedankt voor de reacties!

EDIT: ik zie nu pas dat ik de movieclips in principe gewoon 1x buiten (net voor) de andere functies kan laten draaien en alleen de childs hoef te vervangen. Kan het jammer genoeg niet uitproberen vanaf hier maar ik denk dat dit topic gesloten kan worden.

Verwijderd

Wat je volgens mij het beste kan doen is om in het begin van je klasse (al gebruik je geen apart AS-file zo te zien dus gewoon maar aan het begin dan) je vars te declareren en pas later in je beginfunctie (init of hoe je het ook wilt noemen) te initialiseren en toe te voegen aan de stage.

Flash ActionScript 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
var dot_one:MovieClip;
var dot_two:MovieClip;        
var cross:MovieClip;

function startSpel():void{
  dot_one = new dotGraphic(); 
  dot_two = new dotGraphic();        
  cross = new Cross();

  stage.addChild(dot_one);
  stage.addChild(dot_two);
  stage.addChild(cross);
}

In je resetfunctie kun je dan met een while-loop alle children van de stage verwijderen en de startfunctie terug aanroepen.
Flash ActionScript 3:
1
2
3
4
5
6
function reset():void{
  while(stage.numChildren > 1){
       stage.removeChildAt(stage.numChildren - 1);    
  }
  startSpel();
}
Pagina: 1