Jump to content

[SA|SCM] Arrays


Recommended Posts

Posted (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 :D 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 bytes
f: float, 4 bytes
s: shortstring, 8 bytes
v: 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

 

:cya:

Edited by robin_be
correctie eerste codevoorbeeldje alternatieve notatie
Posted

Yes, thanks Robin :tu: Heb vaker met Arrays gewerkt in 't verleden, maar kon wel weer even een refresh gebruiken.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

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

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...