Jump to content

Een loop een bepaalde tijd laten duren.


Recommended Posts

Geplaatst: (bewerkt)

Ik heb de fout uit de code niet gevonden, maar wat ik anders dacht te doen is een loop te maken die een bepaalde tijdsduur loopt, bijvoorbeeld 5 seconden, en daarna automatisch naar de volgende thread springt. Iemand sugesties?

Alvast bedankt.

Leumas

Bewerkt: door Leumas
Geplaatst:

32@ = 0
repeat
 wait 200
until 32@ > 5000

32@ is 1 van de twee automatische milliseconden counters. Deze wordt automatisch iedere milliseconde met 1 verhoogd. Op bovenstaande manier kun je dus een loop maken die 5 seconden duurt.

Geplaatst: (bewerkt)

Mijn redder, _O_ danku verry much.

Ik was nu al twee dagen bezig aan een missie en ik kwam er echt niet aan uit, ik heb van alles moeten proberen en de enige oplossing was dus een loop te gebruiken met bepaalde tijdsduur.

Ik had nog een vraag:

De $actor zijn maar één keer bruikbaar, en de 1@ blijven maar één maal geldig binnen een thread?

$actor kan ik maar één maal gebruiken in een hele main en 1@ kan ik in elke thread opnieuw gebruiken zonder dat er fouten ontstaan?

Groeten en nogmaals vriendelijk bedankt.

Leumas

Bewerkt: door Leumas
Geplaatst:

Ik vroeg mij af waarvoor de getallen bij order en flag staan en of er ergens een lijst ervan te vinden is:

06E1: AS_actor $1 using_car $PETRO target_car $SANCHEZ with_order 29 max_speed 45.0 traffic_flag 2

Ik had graag deze code gebruikt om een chase te maken tussen twee voertuigen. Dus dat de één de andere continu in de prak probeert te rijden tot als hij vernietigd wordt.

Groeten

Leumas

  • 2 weken later...
Geplaatst:

Hellow

Mijn vraag is of het mogelijk is om twee :LOOPS of meer tegelijkertijd te laten lopen zonder dat je een thread moet aanmaken.

Eventueel aan de hand van een gosub maar dan naar twee gosub's gaan op hetzelfde moment.

:MISSION_08
  gosub :MISSION_MAIN_08
  gosub :MISSION_MAIN_08_A
  gosub :MISSION_MAIN_08_B
  if wasted_or_busted
  then
   gosub @MISSION_FAIL_08
  end
  gosub :MISSION_08_PASS
end_thread

Dit was mijn oorspronkelijk idee maar blijkt niet te werken, hij gaat eerst de eerste gosub helemaal willen lezen om daarna naar de volgende te gaan.

Groeten

Leumas

Geplaatst:

twee loops tegelijktijd laten lopen binnen 1 thread kan niet echt, maar meestal kun je de inhoud van twee loops wel combineren tot 1 loop.

Hoe je dat moet doen, hangt heel erg af van de inhoud van die loops, dus daar is geen generieke oplossing voor te geven.

Geplaatst: (bewerkt)

Ok, eerlijk gezegd zit ik nog steeds te sukkelen met die ene missie waar ik die verschillende threads samen wou laten lopen, ik heb het wel tot 1 thread kunnen beperken dat begint te loopen binnen de missie.

Het probleem is dat player actor dus doorheen een 6 tall checkpoints rijdt en ondertussen twee voertuigen (A en B) elkaar achtervolgen aan de hand van prégedefinieerde paths. Eens voertuig A aan de finish komt omploffen bijde voertuigen en is het mission fail. Dit werkt zonder probleem.

Eens player_actor de finish berijkt omploft alleen voertuig A en is $FRIEND gered en wordt automatisch in het voertuig van player_actor geplaatst, dit lukt ook maar bij het destroyen van de voertuig (A en B) crasht het spel. Ik heb nochthans deze opcodes gebruikt:

0459: end_thread_named 'TRUCK' // --> Dus de thread waar de truck (wagen A) een path volgt.
05EC: release_car $PETRO_2 from_path
06C5: release_car $PETRO_2 from_path // (verschil tussen beide?)

05EC: release_car $SANCHEZ_2 from_path
06C5: release_car $SANCHEZ_2 from_path

0873: release_path 902
0873: release_path 901

En achter deze:

009B: destroy_actor $ENEMY
00A6: destroy_car $PETRO_2
00A6: destroy_car $SANCHEZ_2

Bij het destroyen crasht het spel.

Ik vroeg me ook af of je hier bij if wasted or busted ook 0118: actor 0@ dead bij kon voegen? Dus niet dat beide moeten gelden maar dat één van beide genoeg is om de mission te doen failen.

:MISSION_08
  gosub :MISSION_MAIN_08
  if 
  wasted_or_busted
  (or?)
  0118:   actor 0@ dead 
  then
   gosub @MISSION_FAIL_08
  end
  gosub :MISSION_08_PASS
end_thread

Groeten

Leumas

Bewerkt: door Leumas
Geplaatst:
Ik vroeg me ook af of je hier bij if wasted or busted ook 0118: actor 0@ dead bij kon voegen? Dus niet dat beide moeten gelden maar dat één van beide genoeg is om de mission te doen failen.

:MISSION_08
  gosub :MISSION_MAIN_08
  if
  wasted_or_busted
  (or?)
  0118:   actor 0@ dead
  then
   gosub @MISSION_FAIL_08
  end
  gosub :MISSION_08_PASS
end_thread

Nee, dit moet je niet op dit nivo toevoegen. Het idee achter deze top-level structuur is, dat dit de mission-thread opvangt in het geval dat de player wasted of busted is. in dat geval voert de scm-engine namelijk een return uit voor de missie-thread. En komt hij dus bij de gosub :MISSION_MAIN_08 terug, zonder dat de missie failed, danwel passed is. Daarom wordt in dat geval alsnog de routine MISSION_FAIL uitgevoerd, zodat de speler te zien krijgt dat de missie gefailed is.

Als de missie door enige andere reden failed, dan het wasted of busted zijn van de player, dan moet je in de MAIN routine zelf naar de MISSION_FAILED routine jumpen. Aan het eind daarvan staat een return die de MISSION_MAIN routine terug laat springen naar z'n gosub in de structuur hierboven. In dat geval hoef je dus niet meer naar de MISSION_FAILED te springen, omdat je dat al gedaan hebt.

Ik zie nu trouwens wel dat je de mission structuur niet helemaal correct hebt overgenomen van de tutorial.

:TUT_MISSION_1

thread 'TUT 1'

gosub @TUT_MISSION_1_MAIN

if wasted_or_busted

then

gosub @TUT_MISSION_1_FAIL

end

gosub @TUT_MISSION_1_CLEANUP

end_thread

De laatste gosub moet naar de CLEANUP routine springen, niet naar de MISSION_PASSED.

Het idee is dat de CLEANUP altgijd wordt uitgevoerd aan het eind van een missie, of de missie nu failed of passed is.

bij een missie passed situatie, moet je in de MISSION_MAIN routine zelf, naar de MISSION_PASSED jumpen, en vandaaruit de MISSION_MAIN afsluiten met een return, zodat je weer bij de gosub in de hoofdstructuur terechtkomt. In dit geval zal de player niet wasted of busted zijn, en zal alleen nog de CLEANUP routine worden aangeroepen, en is de missie-thread afgelopen.

Geplaatst:

Dit begrijp ik wel, maar dan vroeg ik mij af hoe ik een deel code kan maken dat geen thread is en de rest van de MAIN laat lopen maar wel steeds nakijkt of de condities in de loop gebeurd zijn. Dus eigenlijk een loop maken maar ervoor zorgen dat de rest van de MAIN gelezen wordt.

:MISSION_08_MAIN

:CHECK
wait 100
if
01AD:   car $PETRO_2 sphere 0 near_point 1360.07 -1709.45 radius 5.0 5.0
jf @CHECK
jump @MISSION_08_FAIL

:REST
...

Ik had dus graag zo een check gemaakt maar het probleem is dat de MISSION_08_MAIN in lus gaat blijven hangen tot dat de $PETRO_2 het punt berijkt heeft en dan pas :REST gaat lezen.

Kan ik die loop niet laten spelen maar ook :REST laten lezen?

Misschien moet ik dan AS_PACK gebruiken maar snap niet goed hoe het werkt. Ik heb de structuren bestudeerd in de originele MAIN maar ben er niet veel wijzer op geworden.

Ik heb dan iets in die genre geprobeerd maar het crasht... was te verwachten denk ik...

0615: define_AS_pack_begin 15@ 
wait 100
if
01AD:   car $PETRO_2 sphere 0 near_point 1360.07 -1709.45 radius 5.0 5.0
jump @MISSION_08_FAIL
0616: define_AS_pack_end 15@ 
0643: set_AS_pack 15@ loop 1

Groeten

Leumas

Geplaatst:
Dit begrijp ik wel, maar dan vroeg ik mij af hoe ik een deel code kan maken dat geen thread is en de rest van de MAIN laat lopen maar wel steeds nakijkt of de condities in de loop gebeurd zijn. Dus eigenlijk een loop maken maar ervoor zorgen dat de rest van de MAIN gelezen wordt.

:MISSION_08_MAIN

:CHECK
wait 100
if
01AD:   car $PETRO_2 sphere 0 near_point 1360.07 -1709.45 radius 5.0 5.0
jf @CHECK
jump @MISSION_08_FAIL

:REST
...

Ik had dus graag zo een check gemaakt maar het probleem is dat de MISSION_08_MAIN in lus gaat blijven hangen tot dat de $PETRO_2 het punt berijkt heeft en dan pas :REST gaat lezen.

Kan ik die loop niet laten spelen maar ook :REST laten lezen?

Dan zou je op deze manier kunnen doen:

:MISSION_08_MAIN

:CHECK
wait 100
if
81AD: NOT  car $PETRO_2 sphere 0 near_point 1360.07 -1709.45 radius 5.0 5.0
jf @MISSION_08_FAIL


:REST
...
jump @CHECK

Misschien moet ik dan AS_PACK gebruiken maar snap niet goed hoe het werkt. Ik heb de structuren bestudeerd in de originele MAIN maar ben er niet veel wijzer op geworden.

Ik heb dan iets in die genre geprobeerd maar het crasht... was te verwachten denk ik...

0615: define_AS_pack_begin 15@ 
wait 100
if
01AD:   car $PETRO_2 sphere 0 near_point 1360.07 -1709.45 radius 5.0 5.0
jump @MISSION_08_FAIL
0616: define_AS_pack_end 15@ 
0643: set_AS_pack 15@ loop 1

Groeten

Leumas

Ik heb hieronder een (vereenvoudigd) stukje code gezet zoals we het in General Dilemma hebben gebruikt, (voor cutscenes):

//Scene
$car1.Create(#BARRACKS,-2002.8884, 130.1186, 47.5391)
$car1.Angle = 136.717
0129: $driver1 = create_actor_pedtype 24 model #ARMY in_car $car1 driverseat 

// Scenario
0615: define_AS_pack_begin 17@ 
05D1: AS_actor -1 drive_car -1 to -2009.9969 180.6255 27.5391 speed 20.0 2 model #NULL 0 
05D1: AS_actor -1 drive_car -1 to -2027.829 169.6961 28.8359 speed 15.0 2 model #NULL 0 
05D1: AS_actor -1 drive_car -1 to -2030.0435 155.3882 28.8359 speed 10.0 2 model #NULL 0 
0616: define_AS_pack_end 17@ 

// Execute
0618: assign_actor $driver1 to_AS_pack 17@

De bestuurder in de auto, zal nu automatisch de beschreven route afleggen, zonder dat je er verder omkijken naar hebt.

Na afloop moet je het nog wel even weer opruimen met:

0687: clear_actor $driver1 task 
061B: remove_references_to_AS_pack 17@

Experimenteer er wat mee, AS_packs zijn ontzettend krachtig om actors een bepaalde sequence van handelingen te laten verrichten. Je hoeft namelijk niet telkens te controleren of de ene handeling klaar is, zodat je de volgende hoeft op te starten. Dat doet de actor namelijk helemaal zelfstandig.

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...