robin_be Posted September 30, 2017 Report Posted September 30, 2017 (edited) Arrays In deze tutorial leg ik uit hoe je met arrays kunt werken in SCM. Benodigdheden GTA:SA en Sannybuilder basis SCM-kennis (Basis SCM-scripten: tutorial door @Dutchy3010 & @PatrickW) --------------------------- Arrays Stel dat je een aantal actors maakt in je script, en je wilt dat die de speler aanvallen. Dit kun je zo doen: 009A: 10@ = create_actor_pedtype 4 model #MALE01 at 2460.1829 -1655.1241 13.3359 009A: 11@ = create_actor_pedtype 4 model #MALE01 at 2465.1829 -1655.1241 13.3359 009A: 12@ = create_actor_pedtype 4 model #MALE01 at 2470.1829 -1655.1241 13.3359 009A: 13@ = create_actor_pedtype 4 model #MALE01 at 2475.1829 -1655.1241 13.3359 009A: 14@ = create_actor_pedtype 4 model #MALE01 at 2480.1829 -1655.1241 13.3359 009A: 15@ = create_actor_pedtype 4 model #MALE01 at 2485.1829 -1655.1241 13.3359 009A: 16@ = create_actor_pedtype 4 model #MALE01 at 2490.1829 -1655.1241 13.3359 0634: AS_actor 10@ attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 0634: AS_actor 11@ attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 0634: AS_actor 12@ attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 0634: AS_actor 13@ attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 0634: AS_actor 14@ attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 0634: AS_actor 15@ attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 0634: AS_actor 16@ attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 (eerst natuurlijk wel het #MALE01 model laden) Hier heb je nu eigenlijk 12 lijntjes die puur herhaling zijn. En bij programmeren weet je: herhaling is (meestal) niet goed en kan je meestal wegwerken! Drie keer raden wat we hiervoor kunnen gebruiken Arrays! Een array is eigenlijk gewoon een reeks variabelen. Bij een array kun je dus gemakkelijk een aantal variabelen aanspreken. Hiervoor gebruik je een basis variabele, en een index variabele: 1@ = 4 20@(1@,1i) = 3 In bovenstaand voorbeeld is 20@ de basis variabele en 1@ de index variabele. Dit wilt zeggen dat je variabele (20+index) zal aanpassen, in dit voorbeeld zal dus de waarde 3 zitten in 24@. Je kan trouwens ook een negatieve index gebruiken, iets wat veel programmeertalen niet leuk vinden. Je ziet ook die '1i' staan. Naast de index moet je de grootte van de array geven, en het datatype van de elementen (dit bepaald hoeveel bytes (plaats) elk element inneemt). De grootte maakt eigenlijk niet uit, je moet gewoon een nummer > 0 gebruiken. Voor het type moet je een teken gebruiken: i: integer 4 bytesf: float, 4 bytess: shortstring, 8 bytesv: longstring, 16 bytes Meestal zul je dus i of f gebruiken. Voorbeeld 1 Nu kunnen we de code uit het oorspronkelijke voorbeeld korter maken: 20@ = 2460.1829 for 0@ = 0 to 6 009A: 10@(0@,1i) = create_actor_pedtype 4 model #MALE01 at 20@ -1655.1241 13.3359 0634: AS_actor 10@(0@,1i) attack_using_weapon_actor $PLAYER_ACTOR flags 7 perform_actions_after_time 2000 chance_of_action 100 20@ += 5.0 end De uitwerking is exact hetzelfde, nu zitten die actoren nog steeds in variabelen 10@ t.e.m. 16@, maar je hebt er minder code voor gebruikt. Voorbeeld 2 De array notatie is ook perfect voor wanneer je bijvoorbeeld een willekeurig doelwit wilt hebben: // in variabelen 10@ tot 14@ zitten allemaal auto's // nu wil je 1 ervan als doelwit hebben 0209: 0@ = random_int_in_ranges 0 6 // resultaat is 0 - 5 0085: 1@ = 10@(0@,1i) // doelwit auto zit nu ook in 1@ 0186: 2@ = create_marker_above_car 1@ Alternatieve notatie In sannybuilder kan je ook een andere notatie gebruiken, één die misschien beter gekend is door mensen die al in andere talen met arrays gewerkt hebben: var 20@: array 5 of Integer end 1@ = 4 20@[1@] = 3 Bij deze notatie kan je zelf een index specifiëren zonder een variabele te gebruiken, maar dit kan enkel bij globale variabelen: var $actors: array 5 of Integer end $actors[2] = 3 Edited October 1, 2017 by robin_be correctie eerste codevoorbeeldje alternatieve notatie Quote
Dutchy3010 Posted September 30, 2017 Report Posted September 30, 2017 Yes, thanks Robin Heb vaker met Arrays gewerkt in 't verleden, maar kon wel weer even een refresh gebruiken. Quote
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.