Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

[flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?

[es] :: Flash :: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?

[ Pregleda: 1938 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.90.*



+4 Profil

icon [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?03.02.2009. u 15:52 - pre 185 meseci
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?
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Vranac
Vranac Srdjan
Software developer
Novi Sad, Vojvodina

Član broj: 3493
Poruke: 353
*.ptt.rs.

Jabber: vranac@elitesecurity.org
ICQ: 64150005
Sajt: www.linkedin.com/in/vrana..


+1 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?03.02.2009. u 16:17 - pre 185 meseci
Radi preko eventa...
Idle mind is the devils playground, in my case it turned out to be an amusement park.

Sustina problema ove zemlje:
Legeonar_: Sto pre treba da shvatite da je EU propast i da se tamo mora raditi,a ne samo biti zaposlen.
http://www.elitemadzone.org/p1864861

Nobody Remains Virgin, Life Fucks Everyone
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
79.101.189.*



+4 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?03.02.2009. u 16:25 - pre 185 meseci
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 :)
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.148.*



+4 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?06.02.2009. u 01:54 - pre 185 meseci
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?
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Vranac
Vranac Srdjan
Software developer
Novi Sad, Vojvodina

Član broj: 3493
Poruke: 353
*.ptt.rs.

Jabber: vranac@elitesecurity.org
ICQ: 64150005
Sajt: www.linkedin.com/in/vrana..


+1 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?06.02.2009. u 07:09 - pre 185 meseci
Jel, a da kazes sta je u pozadini ove price sa rekurzivnim pozivanjem, sta hoces da postignes?
Idle mind is the devils playground, in my case it turned out to be an amusement park.

Sustina problema ove zemlje:
Legeonar_: Sto pre treba da shvatite da je EU propast i da se tamo mora raditi,a ne samo biti zaposlen.
http://www.elitemadzone.org/p1864861

Nobody Remains Virgin, Life Fucks Everyone
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.19.*



+4 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?06.02.2009. u 11:00 - pre 185 meseci
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
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

Vranac
Vranac Srdjan
Software developer
Novi Sad, Vojvodina

Član broj: 3493
Poruke: 353
*.ptt.rs.

Jabber: vranac@elitesecurity.org
ICQ: 64150005
Sajt: www.linkedin.com/in/vrana..


+1 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?06.02.2009. u 11:40 - pre 185 meseci
Axa, znaci hoces game loop koji ce kompenzovati frame rate drop i koji ce generalno drzati konstantan frame rate, ok, pocni recimo odavde
Idle mind is the devils playground, in my case it turned out to be an amusement park.

Sustina problema ove zemlje:
Legeonar_: Sto pre treba da shvatite da je EU propast i da se tamo mora raditi,a ne samo biti zaposlen.
http://www.elitemadzone.org/p1864861

Nobody Remains Virgin, Life Fucks Everyone
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
93.86.50.*



+4 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?06.02.2009. u 12:24 - pre 185 meseci
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...
I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
212.200.219.*



+4 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?06.02.2009. u 17:50 - pre 185 meseci
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()


I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

MilosDj
Milos Djuric
Belgrade

Član broj: 14174
Poruke: 307
79.101.200.*



+4 Profil

icon Re: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?13.02.2009. u 16:06 - pre 184 meseci
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

I'm not in this world to live up to your expectations and you're not in this world to live up to mine.
 
Odgovor na temu

[es] :: Flash :: [flex as3] kako ne rekurzivno pozvati funkciju koja poziva funkciju?

[ Pregleda: 1938 | Odgovora: 9 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.