Jump to content

[F]Lekce 8 - Pole


ffredyk

Recommended Posts

  • Majitel

V předchozích tutoriálech jsem se zapomněl zmínit o polích. Jde s nimi velice snadno zjednodušit práce.. Také vám ukážu jak použít enum, což je vlastně laicky řečeno "pole se jmény".

 

Nejprve vám ukážu k čemu lze pole použít a jak ho vůbec vytvořit a pracovat s ním.

 

Pole můžeme využít k uložení vícero informací do jedné jediné větvící se proměnné.. V Pawn využijete především pole jednoduché a dvojrozměrné.. Já sám jsem ještě troj a více měrné pole nepoužíval, takže ani vám neřeknu zda-li to vůbec jde (mělo by).

 

Pole např můžete uplatnit v situaci kdy máte postaven výtah z 2 a více objektů.. Představte si situaci kdy jste si postavili do mapy výtah, ale ten výtah se skládá z více částí.. V pawn by většina lidí pro každou část výtahu vytvořila novou proměnou a ze scriptu by se mohl stát guláš plný zbytečných proměnných.

 

Pro zpřehlednění scriptu a dosažení stavu kdy "to máte všechno pohromadě" využijeme pole. Deklarace pole je skoro stejná jako u normální proměnné, dokonce vám řeknu, že to děláte často pokud vytváříte stringy! Ano string = pole znaků! Takže i my vytvoříme vlastně string ->

new pole[5];

 

Díky tomuto kódu máme pole o velikosti 5 větví (0 - 4). takže si do něj rovnou můžeme nasázet naše objekty:

pole[0] = CreateObject(...); //První větev
pole[1] = CreateObject(...);
pole[2] = CreateObject(...);
pole[3] = CreateObject(...);
pole[4] = CreateObject(...); //Patá větev.. Pokud nevěříte spočítejte si to 

 

A dále můžeme pro pohyb výtahu použít MoveObject jako zde:

MoveObject(pole[0],X,Y,Z,Speed);
MoveObject(pole[1],X,Y,Z,Speed);
MoveObject(pole[2],X,Y,Z,Speed);
MoveObject(pole[3],X,Y,Z,Speed);
MoveObject(pole[4],X,Y,Z,Speed);

 

Dále může nastat situace, že výtahy máme dva! I zde lze využít polí, a nemusíme zvětšovat počet větví! Stačí vytvořit dvourozměrné pole.

 

Dvourozměrné pole vytvoříme skoro úplně stejně jako pole normální, akorát jsou zde dvě sady počtu větví.

new pole-vytah[2][5];

 

Nyní máme dvourozměrné pole (dvě pole v jednom).

 

POZOR: Hodnota pole pole-vytah[0][3] může být jiná než pole-vytah[1][3]! Tzn. Větve se řadí do sebe podle toho jak jsou zapsané.. Představte si to třeba jako strom:

strom.PNG

Můžete tedy počítat [2]*[5]*další větve -> a každá větev je závislá na té předchozí.

 

A můžeme do něj vložit naše výtahy:

pole-vytah[0][0] = CreateObject(...);
pole-vytah[0][1] = CreateObject(...);
pole-vytah[0][2] = CreateObject(...);
pole-vytah[0][3] = CreateObject(...);
pole-vytah[0][4] = CreateObject(...);
pole-vytah[1][0] = CreateObject(...);
pole-vytah[1][1] = CreateObject(...);
pole-vytah[1][2] = CreateObject(...);
pole-vytah[1][3] = CreateObject(...);
pole-vytah[1][4] = CreateObject(...);

A zase můžeme s výtahem pohybovat jako v předchozím příkladu:

Pohyb 1 výtahu:
MoveObject(pole-vytah[0][0],X,Y,Z,Speed);
MoveObject(pole-vytah[0][1],X,Y,Z,Speed);
MoveObject(pole-vytah[0][2],X,Y,Z,Speed);
MoveObject(pole-vytah[0][3],X,Y,Z,Speed);
MoveObject(pole-vytah[0][4],X,Y,Z,Speed);

Pohyb 2 výtahu:
MoveObject(pole-vytah[1][0],X,Y,Z,Speed);
MoveObject(pole-vytah[1][1],X,Y,Z,Speed);
MoveObject(pole-vytah[1][2],X,Y,Z,Speed);
MoveObject(pole-vytah[1][3],X,Y,Z,Speed);
MoveObject(pole-vytah[1][4],X,Y,Z,Speed);

 

Dobře a co když chceme udělat pole do kterého budeme přidávat hodnoty každou jinou k jinému účelu? To by jsme po chvíli museli pořád hledat jaká větev pole k čemu slouží.. Proti tomu můžeme použít enum, což je vlastně taková pomůcka jak pojmenovat větve pole!

 

Pokud tedy chceme vytvořit pole do kterého uložíme: Počet zabitých hráčů, početzničených aut a nějaký serverový string. Tak vytvoříme enum:

enum SRV
{
killed,
destroyed,
serverstr[120],
}

 

Čárku dělám na každém řádku proto, že když chci do enumu něco přidat tak zapomínám, že na předchozím řádku čárka není

 

 

A nyní vytvoříme pole do kterého enum vložíme:

new server[sRV];

 

POZOR: Je nutno nejdříve vytvořit enum a až poté pole!

 

 

Vidíme, že pro definici počtu větví používáme název enumu. Server si počet větví odvodí z počtu zadaných hodnot do enumu.

 

Nyní již můžeme používat naše pole.. takže třeba do OnPlayerDeath:

server[killed]++;

 

OnVehicleDeath:

server[destroyed]++;

 

A nějaký příkaz pro zadání reklamy třeba:

format(server[serverstr],120,"%s",params);

 

Doufám. že jsem napsal vše co jsem chtěl a na nic nezapoměl.. Ono při psaní tak velké zprávy, kdy se člověk soustředí na jednu věc, zapomíná jako prase.

Link to comment
Share on other sites

pekný tutorial ;) 10/10 tvoje tuty sú večšinou dobré

 

Ani jsi to nečetl..

On si jen chtel napsat prispevek a je mu jedno kam :d

 

Hodnocení - 9/10, mohl si se třeba zmínit jak se pracuje s boolem (např.) v enumu (já to třeba jednou potřeboval a nikde to nebylo :d )

Link to comment
Share on other sites

  • Majitel
pekný tutorial ;) 10/10 tvoje tuty sú večšinou dobré

 

Ani jsi to nečetl..

On si jen chtel napsat prispevek a je mu jedno kam :d

 

Hodnocení - 9/10, mohl si se třeba zmínit jak se pracuje s boolem (např.) v enumu (já to třeba jednou potřeboval a nikde to nebylo :d )

enum SESBLB
{
    bool:apako,
}

Link to comment
Share on other sites

  • Majitel
Ja to vim :d to si měl napsat nahoru :d

 

Ono to většině lidem dojde pokud ovládaj deklaraci proměnných... Moje tuty jsou pro chytřejší lidi :p

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...