Jump to content

Verschil WHILE & WHILE_EXEC


Recommended Posts

Geplaatst: (bewerkt)

Weet iemand het 'echte' verschil tussen een WHILE loop en een WHILE_EXEC loop?

De 'handleiding' is zo vaag hierover, dat ik er niet wijs uit wordt.

Men zegt dat de WHILE_EXEC alle code in het command block uitvoert, maar dat lijkt me ook bij een gewone WHILE loop...

En dan nog een gerelateerde vraag:

Mijn missie bestaat uit 2 'delen': 1. schiet 4 guards neer, maar NIET de 'hoofdpersoon'. 2. Als '1' klaar is, gaat de 'hoofdpersoon' je volgen.

Hoe script ik dit?

Ik heb nu deze opzet:

1. WHILE loop voor de 4 guards, zolang ze nog niet alle 4 dood zijn blijven de arrows op hen gericht en blijft de loop chacken of zij nog leven en de hoofdpersoon niet dood is.

2. Zodra de 4 dood zijn zal hij naar de volgende WHILE loop gaan, die checkt of de 'hoofdpersoon' al in de auto zit.

3. Zodra de 'hoofdpersoon' in de auto zit, zal er weer een WHILE volgen die kijkt of de hoofdpersoon al met de auto in de gracht is geduwd.

Kan dat op deze manier? Dus met 3 WHILE loops onder elkaar?

P.S. kan een WHILE loop in een andere WHILE loop?

Dus bijv:

WHILE ( ( mis1_passed = 0 ) AND ( mis1_failed = 0 ) )

--counter1

WHILE_EXEC ( mis1_guard_kills < 4 )

//check if they all died

ENDWHILE

ENDWHILE

Bewerkt: door ReinierK
Geplaatst:

Volgens mij zitten er in de originele script ook meerdere WHILE loops achter elkaar.

En genest zou moeten kunnen, dus WHILE binnen een WHILE.

Geplaatst: (bewerkt)

Ok, dan ga ik dat ff proberen.

Nog 1 vraag: hoe werkt de code tussen de LEVELSTART en LEVELEND precies?

Ik wil graag alle phones uitzetten als ik op een missie ben ( SAVED_COUNTER player_on_mission = 1 ) en ze weer aan zetten als ik niet meer op een missie ben.

Kan dat ook gewoon met een WHILE?

Dus:

WHILE ( NOT ( HAS_CHARACTER_DIED ( player1 ) ) )

IF ( player_on_mission = 1 )

STOP_PHONE ( phone1 )

STOP_PHONE ( phone2 )

ENDIF

IF ( player_on_mission = 0 )

ANSWER_PHONE ( player1 , phone1 , -1 )

ANSWER_PHONE ( player1 , phone2 , -1 )

ENDIF

ENDWHILE

Bewerkt: door ReinierK
Geplaatst:

Dat zou denk ik wel kunnen. Ook daar heb ik geen ervaring mee :{

Probeer het eens, zou ik zeggen. Als het werkt, dan werkt het.

Geplaatst: (bewerkt)

Ik denk dat ik eindelijk het verschil heb gevonden tussen de WHILE loop en de WHILE_EXEC loop.

Hier komt het: ;)

WHILE_EXEC betekent dat all code binnen deze loop tegelijkertijd wordt gechecked, ik laat het even zien met een voorbeeld:

//Hier kijk je tegelijkertijd naar de twee gebeurtenissen. Als je dus bijv. op een bepaald punt de ped1 neerschiet, stopt de loop. Maar ook als de ped1 de auto bereikt, de volgorde van de commando's maakt hier dus niet uit. Deze loop is geschikt voor bijv. het checken of bepaalde acties zijn uitgevoerd die in willekeurige volgorde plaats mogen vinden (bijv. het stelen van 3 auto's)

WHILE_EXEC ( mission_passed = 0 )
IF ( CHARACTER_HAS_DIED ( ped1 ) )
	++mission_passed
ENDIF
IF ( IS_CHARACTER_IN_CAR ( ped1 , car1 ) )
	++mission_failed
ENDIF
ENDWHILE

Een gewone WHILE is WEL afhankelijk van de volgorde, een voorbeeld:

//Hier is het heel duidelijk dat er tijdens de loop een counter omhoog wordt gegooid, waarna de loop even wacht en dan pas het volgende commando uit zou voeren... Als je dit in een WHILE_EXEC loop zou gooien, dan zou het volgende gebeuren: de counter wordt omhoog gegooid, de speler krijgt (na 1000 cycles) geld en de WHILE_EXEC loop zou constant moeten wachten. Dit zal (denk ik) tot een crash leiden.

WHILE ( IS_CHARACTER_IN_CAR ( player1 ) )
++bonus_money
DELAY_HERE ( 300 )
IF ( bonus_money > 1000 )
	ADD_SCORE ( player1 , 1000 )
ENDIF
ENDWHILE

Ik hoop dat ik het wat duidelijk heb gemaakt. Dus even de regels:

WHILE_EXEC --> Als je meerdere commando's tegelijk wilt uitvoeren of verschillende checks tegelijk wilt uitvoeren.

WHILE -> Als je verschillende commando's en checks in een bepaalde volgorde wilt uitvoeren.

Bewerkt: door ReinierK
Geplaatst:

Ja, dat begreep ik ook al. Ik zie alleen niet waarom jouw eerste code niet in een gewone WHILE kan staan.

Ik bedacht me dat het handig kan zijn als je binnen je while loop een subroutine aanroept. Het spel zal dan je subroutine starten en tegelijk de rest van de code in het blok. Anders start het eerst de subroutine, wacht tot die af is en start dan pas de rest van je code.

Dat je DELAY_HERE niet in while_exec mag gebruiken staat ook vetgedrukt in de handleiding ;) Ik denk niet dat dat crasht, maar dat het onverwachte resultaten geeft.

Overigens lijkt het me niet handig om bijv. de waarde van bonusmoney te veranderen en dat dan te controleren binnen while_exec. Immers, je checkt dan iets wat net aan het veranderen is. Ik ben niet zeker welke waarde het script dan denkt dat bonusmoney heeft.

Geplaatst:

Ik loop tegen een ENORM probleem aan...

GTA2 crasht bij de volgende code:

WHILE_EXEC ( NOT ( mis2_kill_total = 4 ) )
 IF ( HAS_CHARACTER_DIED ( guard1 ) )
++ mis2_kill_total
REMOVE_ARROW ( arrow1 )
 ENDIF
ENDWHILE

Ik ben echt radeloos... Ik weet dat het aan die counter ligt, maar hoe increase ik die in godsnaam anders? Zo staat het ook in de handleiding en tch crasht GTA... AAAAAAAAAAAAAAAAAAAAAAAAAAAARG!

Ok, ik heb hem al opgelost, ik moest de guard blijkbaar deleten...

Maar nu zit ik weer vast... zucht... wat een ontzettend lompe scripttaal

Geplaatst:

Volgens mij heb je daar dan while nodig ipv while_exec.

Het wil mij ook niet echt lukken. Ik wil een guard die gewoon op zijn plekje staat en niks doet. Als de player gaat schieten gaat hij op de player schieten en als de player ophoudt met schieten, gaat hij terug naar zijn plek. Het lukt me wel dat hij begint te schieten als de player begint te schieten, maar als je dan stopt gaat hij wel gewoon door.

Een reactie plaatsen

Je kan nu een reactie plaatsen en pas achteraf registreren. Als je al lid bent, log eerst in om met je eigen account een reactie te plaatsen.

Gast
Op dit onderwerp reageren...

×   Je hebt text geplaatst met opmaak.   Opmaak verwijderen

  Only 75 emoji are allowed.

×   Je link is automatisch ingevoegd.   In plaats daarvan weergeven als link

×   Je vorige bewerkingen zijn hersteld.   Alles verwijderen

×   You cannot paste images directly. Upload or insert images from URL.

  • Recent actief   0 leden

    • Er zijn hier geen geregistreerde gebruikers aanwezig.
×
×
  • Create New...