Toon posts:

[ActionScript] Gebruiker een loop laten stoppen.

Pagina: 1
Acties:
  • 103 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Ik wil in een spel wat ik programmeer graag de gebruiker een loop laten stoppen. En ook ikzelf heb maar al te vaak een while loopje zonder increment zodat ik moet wachten op het alertdingetje om de hele swf te stoppen. Nu had ik het zo gedacht, ik maak een knop die loopjes kan stoppen.

Testopstelling:
ik heb een fout whileLoopje gemaakt, die wordt gestart door de ENTER, en gestopt door een SPATIE.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
firstTime = true;
this.onEnterFrame = function() {
   if (Key.isDown(13) && firstTime == true) {
      firstTime = false;
      i = 0;
      a = 0;
      aap.text = "";
      while (i<1) {
         if (Key.isDown(32)) {
            trace("Breekiebreekie "+a);
            break;
         }
         aap.text = a;
         a++;
      }
   }
};


Bevindingen:

Okay, wat gebeurt er? Ik krijg geen trace, de loop houdt wel op, maar pas na lange tijd, en de waarde van textfield "aap" komt steeds met ongeveer dezelfde waarde, of ik er nu vroeg of laat op druk.

Iemand ideeën?

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 16-04 19:03

bvp

In Java heet dit Threads, maar ik weet niet of dit in actionScript mogelijk is?

Het probleem doet zich voor omdat je pc maar 1 processor heeft => het kan dus maar 1 ding tegelijkertijd. In jouw geval hier dus de while()-loop afwerken en niet ook nog es tussendoor een knop-handler afwerken.

Door het werken met Threads simuleer je dat je processor meerdere dingen tegelijkertijd kan. In feite doet hij dan heel even de while loop en tussendoor kijkt hij steeds 'even' of er op de knop gedrukt wordt.

Jouw key-word bij google zou dus zijn: ActionScript en Threads.

Verwijderd

Topicstarter
Dank je voor je reply. Ik ging ervanuit dat een isDown() een poll deed naar de toets in plaats van te reageren op de event handler. Daar gaat mijn plannetje.

:'(

  • bvp
  • Registratie: Maart 2005
  • Laatst online: 16-04 19:03

bvp

Verwijderd schreef op dinsdag 13 december 2005 @ 10:47:
Dank je voor je reply. Ik ging ervanuit dat een isDown() een poll deed naar de toets in plaats van te reageren op de event handler. Daar gaat mijn plannetje.

:'(
Oh begrijp me niet verkeert hoor, het zou namelijk goed kunnen dat ActionScript heel goed met isDown() om zou kunnen gaan.
Dus dat ActionScript bij een onDown() zelf al regelt dat er met Threading gewerkt wordt?
Leverde een search op de 2 key-woorden in google niks op?

Waarschijnlijk kan iemand die veel met ActionScript werkt hier wel een antwoord opgeven...

  • Murphy
  • Registratie: November 2000
  • Laatst online: 23-03 16:20

Murphy

(2B||!2B)?

Ik zou gewoon een increment in een do{}while() doen, daar zijn ze immers voor gemaakt :D
Flash geeft niets voor niets een error als je een loop hebt zonder voorwaarde increment.

[ Voor 6% gewijzigd door Murphy op 13-12-2005 11:02 ]


  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 25-03 10:55

XangadiX

trepanatie is zóó kinderachtig

Verwijderd schreef op dinsdag 13 december 2005 @ 10:11:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
firstTime = true;
this.onEnterFrame = function() {
   if (Key.isDown(13) && firstTime == true) {
      firstTime = false;
      i = 0;
      a = 0;
      aap.text = "";
      while (i<1) {
         if (Key.isDown(32)) {
            trace("Breekiebreekie "+a);
            break;
         }
         aap.text = a;
         a++;
      }
   }
};
Dit wel een beetje actionscript uit de tijd dat de dinosauriers nog over de aarde zworven. Je grootste probleem is de onEnterFrame functie, als je die nu verving door setInterval dan is de boel al een stuk nauwkeuriger. Als je nu ook nog je Key.isDown vervangt voor een nette eventlistener dan schiet het allemaal beter op denk ik :)

offtopic:
woorden die schuingedrukt zijn doen het uitstekend als zoekterm op zowel GoT als Google

Stoer; Marduq


Verwijderd

Topicstarter
Goed, bedankt voor de replies.
Het is niet het probleem dat het 'oude' code is. onEnterFrame is nog steeds een mooi stukje code, en betrouwbaarder dan setInterval. setInterval middelt op welke frame de code wordt uitgevoerd, en bij een onEnterFrame wordt de code zeker iedere frame uitgevoerd. Verder, een Keylistener is niet een vernieuwde versie van Key.IsDown(). Key.isDown() is een handige functie, en al bestaat ie misschien langer dan keyListeners, er is geen vervanger voor.

Het probleem zit er nog steeds in, dat ik wil dat mijn loopje (de while, niet mijn onEnterframe -die laatste zit er alleen maar in om de boel te vertragen, niet heel elegant, maar het is maar een test-) wordt gebreakt als er een toets in wordt gedrukt.
Als er bij voorbeeld voor een schaakprogramma 10 zetten diep moet worden nagedacht, en dit 60 seconden duurt, zou ik graag inbouwen dat de gebruiker op een knop kan drukken en dat de computer de op dat moment beste zet teruggeeft.
Een andere oplossing?

  • Murphy
  • Registratie: November 2000
  • Laatst online: 23-03 16:20

Murphy

(2B||!2B)?

inderdaad, dit is sowieso niet de meest efficiënte manier. Mag ik trouwens vragen waarom je een loop zonder increment nodig hebt?

  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 25-03 10:55

XangadiX

trepanatie is zóó kinderachtig

Verwijderd schreef op dinsdag 13 december 2005 @ 13:11:
Goed, bedankt voor de replies.
Het is niet het probleem dat het 'oude' code is. onEnterFrame is nog steeds een mooi stukje code, en betrouwbaarder dan setInterval. setInterval middelt op welke frame de code wordt uitgevoerd, en bij een onEnterFrame wordt de code zeker iedere frame uitgevoerd. Verder, een Keylistener is niet een vernieuwde versie van Key.IsDown(). Key.isDown() is een handige functie, en al bestaat ie misschien langer dan keyListeners, er is geen vervanger voor.
Dit is meer dan complete onzin wat je hier verkondigd. setInterval werkt onafhankelijk van de frames of framerate in flash en is daarom bij uitstek geschikt om voor loops en cycles te gebruiken. Key.isDown() is gewoon een subclass van de Key functie die als makkelijkste method een .addListener heeft

uit de AS dictionary
Method
Description

Key.addListener() Registers an object to receive notification when the onKeyDown and onKeyUp methods are invoked.

Key.getAscii() Returns the ASCII value of the last key pressed.
Key.getCode() Returns the virtual key code of the last key pressed.
Key.isDown() Returns true if the key specified in the parameter is pressed.
Key.isToggled() Returns true if the Num Lock or Caps Lock key is activated.
Key.removeListener() Removes
De problemen die jij beschrijft ( het maar half uitvoeren van code en het 'overslaan' van bepaalde statements) komen juist door een pre-historisch gebruik van actionscript en door het niet gebruik maken van event handlers en intervallen op een manier dat ze bedoeld zijn.

Stoer; Marduq


  • Murphy
  • Registratie: November 2000
  • Laatst online: 23-03 16:20

Murphy

(2B||!2B)?

dat hoeft dan ook weer niet he, als ik zeg dat het prehistorische code is dan geef ik er een oplossing en uitleg bij, ik post niet alleen plaatjes. Volgende keer komt er een waarschuwing achteraan

[ Voor 88% gewijzigd door XangadiX op 13-12-2005 16:06 ]


Verwijderd

Topicstarter
Xangadix, ik geef toe dat ik misschien beter strong getypete variabelen had kunnen gebruiken.
Maar voor zover ik weet zal flash een setInterval uitvoeren op een frame.
Let op:
Ik heb een .fla met een framerate van 2, en een met een framerate van 120, met op frame 1 deze code:
code:
1
2
3
4
setInterval(trees, 1);
function trees() {
    trace(getTimer());
}

Bekijk het resultaat.
Hoe kan dit???

Goed, nu on topic:
Ik zal proberen het probleem met een listener op te lossen.
Het gaat er om dat ik ervanuit ging dat een isDown() pollt. Natuurlijk ga ik deze code niet op deze manier in een spel zetten. Maar het ging me om het principe.

Maar goed, het is me eigenlijk wel over zo.
Ik ben er weinig van gediend dat mijn code, die ik heb gebruikt om een probleem zo zuidelijk mogelijk uit te leggen, wordt uitgemaakt voor prehistorisch door een moderator nota bene. Ook al was murphs plaatje wel een lichtpuntje in het geheel.

[ Voor 5% gewijzigd door Verwijderd op 13-12-2005 13:48 ]


  • Murphy
  • Registratie: November 2000
  • Laatst online: 23-03 16:20

Murphy

(2B||!2B)?

Uit de FAQ:

Wij tweakers doen elkaar permanent de groeten. Het is dus niet nodig om steeds ruimteverspillende "greetz $user" of iets dergelijks onder je posts te plakken. Als je persé zoiets wilt kun je daar je signature voor gebruiken.

  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 25-03 10:55

XangadiX

trepanatie is zóó kinderachtig

Verwijderd schreef op dinsdag 13 december 2005 @ 13:42:
Xangadix, ik geef toe dat ik misschien beter strong getypete variabelen had kunnen gebruiken.
Maar voor zover ik weet zal flash een setInterval uitvoeren op een frame.

Goed, nu on topic:
Ik zal proberen het probleem met een listener op te lossen.
Het gaat er om dat ik ervanuit ging dat een isDown() pollt. Natuurlijk ga ik deze code niet op deze manier in een spel zetten. Maar het ging me om het principe.

Maar goed, het is me eigenlijk wel over zo.
Ik ben er weinig van gediend dat mijn code, die ik heb gebruikt om een probleem zo zuidelijk mogelijk uit te leggen, wordt uitgemaakt voor prehistorisch door een moderator nota bene. Ook al was murphs plaatje wel een lichtpuntje in het geheel.
Mja, misschien wat on tactisch geformuleert, maar je begrijpt wel wat ik bedoel toch; door je cycle aan een frame te koppelen krijg je niet altijd het gewenste resultaat; en dat blijft mijns insziens de angel van het probleem.
Wat ik alleen maar wil suggereren is dat door het herschrijven van de code met listener objecten je wellicht van het probleem af bent. Dat je daarna geen zin hebt om het te proberen omdat je het beter weet moet je natuurlijk zelf weten, ik probeer alleen maar te helpen en je te vertellen dat het wellicht verstandig is je te verdiepen in een modernere variant van actionscript omdat ze dat echt niet voor niks hebben bedacht. Je code is verouderd en als ik dat dan bij wijze van ludiciteit het 'prehistorisch' noem dan bedoel ik daar niks verkeerds mee O-) ;)
Uit de FAQ:

Wij tweakers doen elkaar permanent de groeten. Het is dus niet nodig om steeds ruimteverspillende "greetz $user" of iets dergelijks onder je posts te plakken. Als je persé zoiets wilt kun je daar je signature voor gebruiken.
:?

[ Voor 15% gewijzigd door XangadiX op 13-12-2005 16:15 ]

Stoer; Marduq


Verwijderd

Topicstarter
Nou, nog een keer dan. Met een eventlistener kun je niet inline een loop doorbreken. Maar geloof me,
ik weet hoe ik een event moet invoken.
Mijn hoop was gevestigd op de isDown().

Nu wil ik nog wel weten wat je vindt van het setInterval scriptje wat ik postte. Is wel een raar probleem.
Ik hoop dat je de trace functie wel modern genoeg vindt.

Kan iemand me vertellen wat een Key.isDown() achter de schermen precies doet?

Alvast bedankt.

  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
offtopic:
stond niet in mx bible dat setInterval wel altijd samenvalt met de nearest frame. as dit niet zo is: why?

  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 25-03 10:55

XangadiX

trepanatie is zóó kinderachtig

Nu wil ik nog wel weten wat je vindt van het setInterval scriptje wat ik postte. Is wel een raar probleem.
Ik hoop dat je de trace functie wel modern genoeg vindt.
Ik vind de trace functie altijd een beetje post modern omdat hij er wel is, maar de toeschouwer hem nooit ziet... uh... nevermind ;)

Nee, je hebt gelijk dat blijkbaar de setInterval gekoppeld is aan de framerate, maar ik denk eerder dat het zo is dat het her-evalueren van de frame rout in het eten gooit en niet zozeer de setInterval, want de waarden die hij terug geeft zijn hetzelfde, alleen op 120 frames per seconden geeft hij er veel meer terug.

gelukkig staat dat ook gewoon keurig in de dictionary:
If interval is less than the movie frame rate (for example, 10 frames per second (fps) is equal to 100 milliseconds), the interval function is called as close to interval as possible. You must use the updateAfterEvent function to make sure that the screen refreshes often enough. If interval is greater than the movie frame rate, the interval function is only called each time the playhead enters a frame in order to minimize the impact each time the screen is refreshed.
I stand corrected hier dus (een beetje :P)

Maar over event handling; de finesses ervan kan ik je ook niet precies uitleggen; maar gelukkig is er dan nog altijd de macromedia knowledge database waar ik dit artiekel in vond:

http://www.macromedia.com...tionscript/asdg2_ch10.pdf

wellicht heb je er iets aan (heb het alleen vluchtig doorgelezen)

[ Voor 7% gewijzigd door XangadiX op 13-12-2005 18:15 ]

Stoer; Marduq


Verwijderd

Topicstarter
Dank!
Dat artikel ziet er interessant uit. Voor zover ik nu kan zien wordt het moeilijk whiles te breaken met toetsen. Maar ik zou de functie over meerdere whiles kunnen verdelen en tussen de whiles kunnen stoppen. Totdat flash multithreading gaat ondersteunen...

P.S.
Die waardes uit de setInterval trace zijn inderdaad merkwaardig.
Niet consistent, niet eens gelijkmatig verdeeld over de frames.

  • Splash
  • Registratie: September 2001
  • Laatst online: 14-04 20:24
[foutje]

[ Voor 99% gewijzigd door Splash op 13-12-2005 23:16 ]


  • XangadiX
  • Registratie: Oktober 2000
  • Laatst online: 25-03 10:55

XangadiX

trepanatie is zóó kinderachtig

Verwijderd schreef op dinsdag 13 december 2005 @ 22:53:
P.S.
Die waardes uit de setInterval trace zijn inderdaad merkwaardig.
Niet consistent, niet eens gelijkmatig verdeeld over de frames.
dat is wel grappig dat je dat zegt; ik kwam op een schaal van 1:16 uit terwijl je een schaal van 1:60 (2/120) verwacht; in eerste instantie dacht ik dat het de Timer() functie was, maar met een simpele count++ kreeg ik gelijksoortige resultaten... raar verhaal wel, ik kon er ook niks (meer) over vinden op de macromedia livedocs :/

Stoer; Marduq


  • hobbit_be
  • Registratie: November 2002
  • Laatst online: 04-07-2025
offtopic:
ivm setInterval.

Ik gebruik al een hele tijd een animation engine (keyframes) die oorspronkelijk gebruik maakte van setInterval (werd overal aangeraden). Maar daar kreeg ik vaak veel schokken door (ie de intervals waren niet echt regelmatig). Toen heb ik daar dan nog time smoothing op toegepast (soort van Median Filter) om veralsnog gewoon ALLES te laten doen op de onEnterframe van een global MC. alle probleempjes van smoothness waren direct weg.

Ook blijft de vraag waarom zou iets doen TUSSEN frames door? (voor animatie dan toch).

Bovendien is de framerate ook een hele miserie (ie je kent wel dat je zoveel mogelijk prime number kunt gebruiken) alsook dat de max frame rate in IE zowieso 60 is.
Pagina: 1