[ MilosDj @ 03.02.2009. 15:52 ] @
Napravim standardan flex as3 projekat.

U konstruktor stavim funkciju zvanu start()

ostale funkcije u sustini rade ovo:

private start():void { f1();}

private function f1():void { f2();}

private function f2():void { f1();}


U kad testiram swf ili pukne ili se izvrsi onoliko puta koliko sam ogranicio pozive f. Tj sve se izvrsava ko standardna rekurzivna f. Samo sto ovde jedna zove drugu.

Znaci, i dalje zelim da funkcije pozivaju jedna drugu, ali da se pritom i "zavrse".

U sustini hocu da imam dva odvojena koda koja na smenu rade GOTO jedan na drugi.
Konstruktor pokrene akciju, f1 odradi svoje, pozove f2 i ne ceka da se zavrsi f2 nego se gasi, skida sa steka ili sta vec treba. f2 radi svoje, poziva f1 i gasi se. i tako u krug.

Neka ideja?
[ Vranac @ 03.02.2009. 16:17 ] @
Radi preko eventa...
[ MilosDj @ 03.02.2009. 16:25 ] @
Jedina ideja mi je timer event...

Pa da umesto standardnog call f2(); pozovem f2 preko timera sa vrednoscu 0.
Ima l' nesto cistije? Gde se dela divna GOTO naredba :)
[ MilosDj @ 06.02.2009. 01:54 ] @
Argh!

Koristio sam cist Event:

private var calcOver_e:Event = new Event("CALC_OVER");
this.addEventListener("CALC_OVER", recall_f);


A u f2 na kraj sam stavio: dispatchEvent(calcOver_e);

Radi, nije da nije. Problem nastaje kad pustim da se funkcije pozivaju max brzinom.
Flex prijavi stack overflolw :(((((((((
A stack je prepun eventova :(

Nije mi jasno kako moze toliko da ih izgenerise?
[ Vranac @ 06.02.2009. 07:09 ] @
Jel, a da kazes sta je u pozadini ove price sa rekurzivnim pozivanjem, sta hoces da postignes?
[ MilosDj @ 06.02.2009. 11:00 ] @
Ja zelim da izbegnem rekurziju :) Makar sam mislio da je tu problem.

Zelim da napravim svoj onEnterFrame koji ce mi javljati koliko je ostalo vremena i koji ce adekvatno smanjiti frame rate ako racun potraje.
To je sve lako, i to sam sve uradio. Jako lepo se prilagodjava kad ga zovem preko timer-a.

Pazi, ja opet nemam stabilan frameRate. ALI imam tacan broj ms koje mi ostanu ili koliko je probio, pa se tako lepo prilagodjava. Konacno bi mogu da imam savrseno glatku animaciju za moje oko u realnom vremenu.

Mana je sto nece da radi u realnom vremenu.

f1 racuna bilo sta vezano za animaciju, ogricu, ma bilo sta.
f2 samo radi wait.

Ako ih zovem medjusobno, propast, stack overflow.
Ako ih zovem preko Eventa stack Event overflow.

Jedino rade ako ih pozovem preko keyboard eventa koji okine timer koji pozove funkciju

while(i<1000)
{i++;
f1();
f2();
}

I onda se odradi ceo ciklus od 1000. Skucam proesor. I nista ne vidim na ekranu :D

Kao da samom flashu treba neki predah da sve to iscrta na ekranu... Dokle god sam zarobljen u nekoj mojoj funkciji, on to ne radi
[ Vranac @ 06.02.2009. 11:40 ] @
Axa, znaci hoces game loop koji ce kompenzovati frame rate drop i koji ce generalno drzati konstantan frame rate, ok, pocni recimo odavde
[ MilosDj @ 06.02.2009. 12:24 ] @
Procitao. Hvala :) Zastrasujuce koliko je ideja ista.

Ok, znaci otkrivam toplu vodu, al neka ;)

On startuje gameLoop preko timera. I njemu igra radi. Ja zelim da startujem moju animaciju preko dispatchEventa koji ce da startuje funkciju iz koje je pozvan i to ne radi.
"Radi"... Skuca procesor, i na kraju, kad se zavrse svi loops pojavi se slika :D
Ili prepuni stack...
[ MilosDj @ 06.02.2009. 17:50 ] @
Pazi, ovo radi jako lepo, razumljivo, fino i bajno:

Code:
package {
            import flash.display.Sprite;
            import flash.events.TimerEvent;
            import flash.text.TextField;
            import flash.text.TextFieldAutoSize;
            import flash.text.TextFieldType;
            import flash.utils.Timer;
    
    public class gameLoop extends Sprite
    {
        private var i_int:int=0;
        private var zbir_int:int=0;
        private var counter_int:int=0;
        private var time_txt:TextField=new TextField();
        
        public var myTimer:Timer = new Timer(10, 2050);    // 10 ms, 22250 times repeat
        
        
public function gameLoop() //constructor
{
    myTimer.addEventListener(TimerEvent.TIMER, f1); // lynda tom perkins verzija timera
    myTimer.start();
            
time_txt.type = TextFieldType.DYNAMIC;
time_txt.border = true;
time_txt.background = true;
time_txt.backgroundColor = 0xD6D3CE;// 0xFFFF66;
time_txt.width = 160; //px
time_txt.height = 450;
time_txt.autoSize = TextFieldAutoSize.LEFT; //size from left
time_txt.wordWrap = true;
time_txt.text = "Initializing! Please wait.";
addChild(time_txt);
} //end of constructor
        
        
private function f1(e:TimerEvent):void
{
    counter_int++;
    for(i_int=0;i_int<100000;i_int++)
    {
        zbir_int=zbir_int+i_int;
        
    }
    time_txt.text = "loop counter: "+counter_int+
    "\nzbir: "+zbir_int;
} //end of f1
        
    } //end of class
} // end of package


A kad probam da pozivam tu istu funkciju ovako:
Code:

package {
            import flash.display.Sprite;
            import flash.events.Event;
            import flash.events.KeyboardEvent;
            import flash.text.TextField;
            import flash.text.TextFieldAutoSize;
            import flash.text.TextFieldType;
            import flash.utils.Timer;    
    
    
    public class gameLoop1 extends Sprite
    {
        private var i_int:int=0;
        private var zbir_int:int=0;
        private var counter_int:int=0;
        private var time_txt:TextField=new TextField();
        
        public var myTimer:Timer = new Timer(10, 2050);    // 10 ms, 22250 times repeat
        
        
public function gameLoop1() //constructor
{
//    myTimer.addEventListener(TimerEvent.TIMER, f1); // lynda tom perkins verzija timera
//    myTimer.start();
stage.addEventListener(KeyboardEvent.KEY_UP, startGame_f);
this.addEventListener("_START", f1);

            
time_txt.type = TextFieldType.DYNAMIC;
time_txt.border = true;
time_txt.background = true;
time_txt.backgroundColor = 0xD6D3CE;// 0xFFFF66;
time_txt.width = 160; //px
time_txt.height = 450;
time_txt.autoSize = TextFieldAutoSize.LEFT; //size from left
time_txt.wordWrap = true;
time_txt.text = "Initializing! Please wait.";
addChild(time_txt);
} //end of constructor
        
private function startGame_f(event:KeyboardEvent):void
{
        if(event.keyCode==32)
    {
    dispatchEvent(new Event("_START")); //calls f1();
    }
}

        
private function f1(e:Event):void
{
    counter_int++;
    for(i_int=0;i_int<100000;i_int++)
    {
        zbir_int=zbir_int+i_int;
        
    }
    time_txt.text = "loop counter: "+counter_int+
    "\nzbir: "+zbir_int;

        dispatchEvent(new Event("_START")); //calls f1();
} //end of f1
        
    } //end of class
} // end of package


Sve ode u pm :( Samo izbaci zilion ovakvih errora. Zato i mislim da je greska u glupim rekurzijama. A ja veze nemam kako da ih se resim.
Citat:

Error: Error #2094: Event dispatch recursion overflow.
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at gameLoop1/f1()

[ MilosDj @ 13.02.2009. 16:06 ] @
A ni ovo ne radi. Ima li iko ideju kako i zasto ????????????????

Code:
package {
            import flash.display.Sprite;
            import flash.events.Event;
            import flash.events.KeyboardEvent;
            import flash.text.TextField;
            import flash.text.TextFieldAutoSize;
            import flash.text.TextFieldType;
            import flash.utils.Timer;
            //import flash.display.*;
            
    
    
    public class gameLoop1 extends Sprite
    {
        private var i_int:int=0;
        private var zbir_int:int=0;
        private var counter_int:int=0;
        private var time_txt:TextField=new TextField();
        public var again:Event=new Event("_AGAIN",false,true);
        public var reload:Event=new Event("_RELOAD",false,true);
        public var start:Event=new Event("_START",false,true);
        
        public var gameLoopStartTimer:Timer; // = new Timer(10, 2050);    // 10 ms, 22250 times repeat
        
        
public function gameLoop1() //constructor
{

stage.addEventListener(KeyboardEvent.KEY_UP, startGame_f);
stage.addEventListener(start.type, f1,false,0,false);
stage.addEventListener(again.type, f2,false,0,false);
stage.addEventListener(reload.type,f1,false,0,false);
//this.addEventListener("_AGAIN",f1,false,0,false);
//this.addEventListener("_RECALL",f2);
//this false e error
//stage true  e error
            
time_txt.type = TextFieldType.DYNAMIC;
time_txt.border = true;
time_txt.background = true;
time_txt.backgroundColor = 0xD6D3CE;// 0xFFFF66;
time_txt.width = 160; //px
time_txt.height = 450;
time_txt.autoSize = TextFieldAutoSize.LEFT; //size from left
time_txt.wordWrap = true;
time_txt.text = "Initializing! Please wait.";
addChild(time_txt);
} //end of constructor
        
private function startGame_f(e:KeyboardEvent):void
{
    e.stopImmediatePropagation();
    e.preventDefault();

        if(e.keyCode==32)
    {
    dispatchEvent(start); //calls f1();
    stage.removeEventListener(start.type,f1);
    }
}

        
private function f1(e:Event):void
{
    e.stopPropagation();
    e.preventDefault();
    e.stopImmediatePropagation()
    counter_int++;
    for(i_int=0;i_int<1000;i_int++)
    {
        zbir_int=zbir_int+i_int;
        
    }
    time_txt.text = "loop counter: "+counter_int+
    "\nzbir: "+zbir_int+
    "\n"+start.type;

/*
stage.addEventListener(again.type, f2,true,0,false);
stage.addEventListener(reload.type,f1,true,0,false);
*/
stage.removeEventListener(reload.type, f1);
    dispatchEvent(again); //calls f2();
} //end of f1

public function f2(e:Event):void
{
    e.preventDefault();
    e.stopImmediatePropagation();
    e.stopPropagation();
/*

stage.addEventListener(reload.type,f1,true,0,false);
*/
stage.addEventListener(reload.type, f1,true,0,false);
stage.removeEventListener(again.type,f2);    
    dispatchEvent(reload);    //calls f1();
}    


        
    } //end of class
} // end of package