Leumas Geplaatst: 25 augustus 2008 Rapport Geplaatst: 25 augustus 2008 (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: 25 augustus 2008 door Leumas Reageren
PatrickW Geplaatst: 25 augustus 2008 Rapport Geplaatst: 25 augustus 2008 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. Reageren
Leumas Geplaatst: 25 augustus 2008 Auteur Rapport Geplaatst: 25 augustus 2008 (bewerkt) Mijn redder, 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: 25 augustus 2008 door Leumas Reageren
Leumas Geplaatst: 25 augustus 2008 Auteur Rapport Geplaatst: 25 augustus 2008 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 Reageren
Leumas Geplaatst: 9 september 2008 Auteur Rapport Geplaatst: 9 september 2008 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 Reageren
PatrickW Geplaatst: 9 september 2008 Rapport Geplaatst: 9 september 2008 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. Reageren
Leumas Geplaatst: 9 september 2008 Auteur Rapport Geplaatst: 9 september 2008 (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: 9 september 2008 door Leumas Reageren
PatrickW Geplaatst: 10 september 2008 Rapport Geplaatst: 10 september 2008 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_1thread '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. Reageren
Leumas Geplaatst: 10 september 2008 Auteur Rapport Geplaatst: 10 september 2008 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 Reageren
PatrickW Geplaatst: 10 september 2008 Rapport Geplaatst: 10 september 2008 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. Reageren
Recommended Posts
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.