[Tutorial] Absolute beginner tutorials [SC]
#4

"Let's communicate" is het thema van deze post, de 4e tutorial in de serie. In deze tutorial staat de interactie met meerdere gebruikers centraal.

4e commando: /healall
In deze tutorial gaan we de commando's die we geleerd hebben in de vorige tutorials combineren tot ййn geheel. We gaan werken met if-statements om te controleren of de persoon in een voertuig zit en ook gaan we een stap hoger zetten naar lussen ('loops' in het Engels).

Het commando
In dit commando repareren we alles: het leven van de persoon en, als ze in een voertuig zitten, het voertuig.
De meeste functies die we gaan gebruiken zijn al bekend. Hetgene wat er in deze tutorial bij komt is: IsPlayerConnected en lussen (voor nu is het de meest gebruikte lus: de for-lus).

Allereerst de theorie over lussen. Een lus is een stuk code wat zich steeds herhaald zolang een bepaalde conditie (dit kan je teruglezen bij: "Level up!" in de vorige tutorial) waar is. Een for-lus is als volgt opgebouwd:
Код:
for(
counter initialisatie;
conditie;
actie die uitgevoerd wordt nadat de lus is doorlopen (bijvoorbeeld de counter ophogen)
) { }
Een voorbeeld zoals deze lus gebruikt kan worden (je hoeft het nog niet te begrijpen):
pawn Код:
for(new id=0; id<MAX_PLAYERS;id++)
{
    SendClientMessage(id,COLOR_RED,"Hey player!");
}
In bovenstaande code wordt een counter aangemaakt ( id ). In de conditie wordt gecontroleerd of 'id' lager is dan MAX_PLAYERS (wat de waarde 500 heeft). Zolang dat waar is, dan wordt de code uitgevoerd binnen de haken (het sturen van een bericht naar de speler met playerid 'id'). Nadat de code is uitgevoerd wordt 'id' opgehoogd met 1.

Dezelfde code gaan wij ook implementeren in ons commando. Allereerst bouwen we het commando op:
pawn Код:
if(!strcmp("/healall",cmdtext,true))
{
    // code
    return 1;
}
Nu gaan we de for-lus implementeren in ons commando:
pawn Код:
if(!strcmp("/healall",cmdtext,true))
{
    for(new id=0;id<MAX_PLAYERS;id++)
    {
        // code voor iedere speler
    }
    return 1;
}
Nu eerst iets over de MAX_PLAYERS, die komt steeds terug en je vraagt je misschien af wat het is. MAX_PLAYERS is een zogenoemde 'constante' het is een variabele waarvan de waarde niet verandert. MAX_PLAYERS bevat het maximum aantal spelers dat je in je server kan hebben (dit is gedefinieerd door SA:MP, je kan hem zelf weer opnieuw definieren zodat je code efficienter wordt, maar dat is nu nog te hoog gegrepen).

De lus loopt dus door iedere speler die aanwezig kan zijn in de server. Nu kan je natuurlijk niet van iemand het leven veranderen die niet aanwezig is in je server! Daarvoor is de eerstgenoemde functie zeer makkelijk: IsPlayerConnected(). Deze functie controleert of de speler aanwezig is in de server (dan geeft hij 1 (true) terug en anders 0 (false)).

Nu is dit allemaal heel leuk, maar hoe gaan we dat implementeren in onze code? Hoe zorgen we ervoor dat de lus die speler (die er niet is) overslaat? Een lus komt met een aantal functies die gebruikt worden om de lus te beпnvloeden:
  • exit; // deze functie zorgt ervoor dat de lus helemaal wordt afgebroken: er wordt verder gegaan na de lus
  • continue; // deze functie zorgt ervoor dat het huidige item wordt overgeslagen. De derde parameter wordt aangeroepen (het ophogen van de counter) en de lus start opnieuw.
Deze functies gaan we dan ook leuk gebruiken, althans, ййn ervan: continue;.

pawn Код:
if(!strcmp("/healall",cmdtext,true))
{
    for(new id=0; id<MAX_PLAYERS; id++)
    {
        if(!IsPlayerConnected(id)) // als de speler niet is verbonden, dan skip deze ronde
        {
            continue;
        } else { // speler is wel verbonden voer het volgende uit
            if(IsPlayerInAnyVehicle(id)) // is de speler in een voertuig?
            {
                RepairVehicle(GetPlayerVehicleID(id)); // Repareer het voertuig
                SendClientMessage(id, 0xFF0000AA, "Oehh, nice and shiny!"); // stuur een bericht naar de speler
            }
            // deze code wordt aangeroepen ook al is de IF(IsPlayerInAnyVehicle) niet waar. dit is immers geen ELSE
            SetPlayerHealth(id,100.0); // zet de spelers leven op 100
            SendClientMessage(id,0xFF0000AA,"We gaan er weer met frisse moed tegenaan!"); // stuur een bericht naar de speler
        }
    }
    return 1; // het commando is gevonden
}
Zo hebben we een nieuw commando gemaakt waar we alles weer heel hebben gemaakt. Iedere speler die in je server aanwezig is kan er weer met frisse moed tegen aan.

Quote:
Originally Posted by Hiddos
Посмотреть сообщение
Ho ho! Je heb niet uitgelegd wat variabelen zijn! (Gewoon een klein stukje over opslag kan genoeg zijn, een basis om later uit te breiden.)
Oei! Excuus! :O Er is inderdaad iets gezegd over een 'constante', maar over de echte 'variabele' is nog niets gezegd.
Ieder dingetje wat je maakt wordt ergens opgeslagen in het geheugen. Je kunt bij deze dingen komen door het geheugenadres te specificeren. Je weet echter niet op welk adres het is opgeslagen in PAWN (niet op deze manier in ieder geval) in tegenstelling tot een lagere programmeertaal zoals Assembly. Om dingen wat makkelijker voor je te maken om ze terug te vinden (bijvoorbeeld een bepaalde auto die je hebt aangemaakt) worden variabelen gebruikt. Een variabele maak je aan door 'new' te gebruiken. Bijvoorbeeld:
pawn Код:
new myCar = AddStaticVehicle(/* hier je parameters */);
myCar is nu een variabele en kan ergens anders in je code weer gebruikt worden, mits je hem globaal hebt gedefinieerd. Hier ga ik nu niet op in, maar misschien in een volgende tutorial. Voor nu is het belangrijk dat je weet wat een variabele doet, niet wat voor types er zijn (er zijn 2 types: globaal en lokaal definieerde variabelen.. maar shht, dit heb ik nog niet verteld).


Suggesties voor tutorials? Vragen hierover? Stuur me een PM!

-Wijzigingen voorbehouden-
Reply


Messages In This Thread
Absolute beginner tutorials [SC] - by mamorunl - 23.04.2011, 16:19
/healme -Absolute beginner- [SC]2 - by mamorunl - 24.04.2011, 20:11
Re: Absolute beginner tutorials [SC] - by mamorunl - 27.04.2011, 15:43
Re: Absolute beginner tutorials [SC] - by mamorunl - 02.05.2011, 13:41
Re: Absolute beginner tutorials [SC] - by Hiddos - 03.05.2011, 16:16
Re: Absolute beginner tutorials [SC] - by swell - 28.08.2012, 14:24
Re: Absolute beginner tutorials [SC] - by swell - 28.08.2012, 15:11
Re: Absolute beginner tutorials [SC] - by swell - 28.08.2012, 15:18
Re: Absolute beginner tutorials [SC] - by swell - 28.08.2012, 15:25
Re: Absolute beginner tutorials [SC] - by Dredd - 28.08.2012, 20:19

Forum Jump:


Users browsing this thread: 2 Guest(s)