Premenné

Sem vkládejte editovatelné kusy kódu a tutoriály.
User avatar
Ap0
Redaktor
Posts: 370
Joined: August 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Location: zamiešany v malte
Contact:

Premenné

Post by Ap0 »

Čo sú to premenné?

Pod pojmom premenné sa myslí ľubovoľný názov, ktorý v sebe uchováva určitú hodnotu. V jazyku GML sa hodnota môže javiť v dvoch podobách:
reťazec (forma textu) - string a číslo - real
Existujú však ešte konštanty true a false, známe ako boolean, ktoré zastupujú čísla 1 a 0.

Dajte si pozor na názov, pretože v sebe nesmie niesť diakritické znamienka ako mäkčene, dĺžne a pod., nesmie byť dlhší ako 64 znakov a čo je najdôležitejšie a čo väčšina ľudí zabúda, názov nesmie byť rovnaký, ako názov nejakého objektu, zvuku, spritu atď., alebo ako názov funkcie a konštanty.

Na začiatok si skúsime vytvoriť premennú:

Code: Select all

premenna1 = 5;
premenna2 = "ahoj";
premenna3 = true;
V tomto prípade máme vytvorenú alebo definovanú premennú s názvom "premenna1" a hodnotou 5, ďalej existuje "premenna2" s hodnotou "ahoj" a ešte sme si vytvorili "premenna3" s hodnotou true.

Pretože "premenna1" obsahuje číselnú hodnotu, musíme s ňou pracovať ako s číslom, teda nemôžeme k nej priradiť text.

"premenna2" je vytvorená ako reťazec - je ohraničená úvodzovkami, a teda s ňou naopak nemôžeme pracovať ako s číslom.

Na záver "premenna3" je definovaná ako true, teda pravda, alebo tiež ako číslo 1. Pracovať teda môžeme len s hodnotami true, 1, false, 0.




Premenné mám vytvorené, čo s nimi?

Premenné sú dosť dôležité, bez nich si hru v podstate ani nevieme predstaviť. Typickým príkladom je napríklad počítanie nahraného skóre.

Skusíme si teraz jednotlivé vytvorené premenné vykresliť na obrazovku. Ideme kresliť :D , takže event draw...

Code: Select all

draw_text(x,y,string(premenna1));
Prečo string? Funkciou string sa konvertuje číselný typ hodnoty na reťazec. A keďže draw_text vykresluje len text v úvodzovkách, je to nevyhnutné...
Takže nám to krásne vykreslí číslo 5. V opačnom prípade nám to vykreslí nulu, pretože berie premennú ako reťazec, ktorý neexistuje.

Code: Select all

draw_text(x,y,premenna2);
V tomto prípade nám už bez zbytočnej funkcie string vykreslí text ahoj, lebo premenná už obsahuje hodnotu ako reťazec.

Code: Select all

draw_text(x,y,string(premenna3));
Tu sme znovu použili funkciu string, pretože premenná opäť nie je reťazec, ale boolean. Nevykreslí nám to true alebo false, ale 1 alebo 0.




Ako premennú zmením?

Pre zmenu premenných je určená syntax, ktorú nie je ťažké pochopiť.
Ak pracujeme s číslom, sú dostupné znaky + - * /.


Skúsime teraz zmeniť prvú premennú:

Code: Select all

premenna1 += 10;
Keďže na začiatku sme si "premenna1" definovali s hodnotou 5, teraz sme ku nej pripočítali hodnotu 10. Teda teraz má hodnotu 15.
Logicky ak by sme chceli pokračovať s inými znamienkami, môžeme pokračovať:

Code: Select all

premenna1 -= 7; //výsledok -2
premenna1 *= 4; //výsledok 20
premenna1 /= 2; //výsledok 2.5 (!nie 2,5)
Podobne môžeme použiť všetky matematické operácie, napríklad:

Code: Select all

premenna1 = 5+((10*2)/(1-(50*2)));
Ak by sme malí teoreticky vytvorenú ďalšiu premennú "premenna4" s hodnotou 10, tak obidve sú číselnej formy, a tak aj oni môžu spolu pracovať:

Code: Select all

premenna1 = 10*premenna4+8; //výsledok by bol 108
V reťazci je to inak, tu je dostupné len sčítavacie znamienko + a to na spojenie reťazcov. Príklad:

Code: Select all

premenna2 += " svet!"; //výsledok "ahoj svet!"
V treťom prípade boolean sa ani veľmi nepoužívajú takéto operácie.


Ako sme písali, všetky premenné sa konajú len v jednom objekte, v ktorom je kód.

Ak chcem použiť premennú z iného objektu, musíme to zadať formou "nazov_objektu.premenna1", napríklad:

Code: Select all

premenna1 = objPlayer.premmena1*10;
V tomto prípade sme si vytvorili v svojom objekte premennú "premenna1", ktorá použila už existujúcu "premmena1" v objekte objPlayer a vynásobila ho 10.

Ak však chcem použiť jednu jednotnú premennú pre celú hru, hodia sa globálne premenné, s ktorými sa ľahšie pracuje. Napríklad:

Code: Select all

global.premenna1 = 10;
Tu sme si vytvorili samostatnú premennú, s ktorou je možné manipulovať zo všetkých objektov v hre.




Pole (array)

Polia alebo aj indexované premenné sa zapisujú metódou "premenna[0-32000]", napríklad:

Code: Select all

premenna[0] = "Peter";
premenna[1] = "Tomáš";
premenna[2] = "Richard";
premenna[3] = "Matej";
premenna[4] = "Lukáš";
Pracuje sa s nimi úplne rovnako ako s obyčajnými premennými, ibaže ľahšie ak chceme vyberať jednotlivé premenné či už použitím cyklov alebo podobne.

Každá premenná je teraz určená piatimi číslami, skúsme teraz taký malý pokus, vytvoríme si ešte jednu premennú:

Code: Select all

premenna1 = 1;
Obyčajná premenná, ktorá obsahuje hodnotu 1. Teraz skúsme vykresliť meno, ktoré chceme:

Code: Select all

draw_text(x,y,premenna[premenna1]);
Čo to logicky spraví? "premenna1" určuje hodnotu 1, teda vyberie premennú "premenna[1]", a vykreslí sa meno "Tomáš";
Skúsme náhodne definovať nejaké meno...

Code: Select all

nahodne_meno = premenna[choose(0,1,2,3,4)];
Funkcia choose nám náhodne vyberie jedno meno, a definuje premennú "nahodne_meno" na ľubovoľné meno. Vykreslíme ho potom logicky takto.

Code: Select all

draw_text(x,y,nahodne_meno);

Na zložitejšie operácie boli vytvorené tzv. dvojrozmerné polia, ich zápis je napríklad:

Code: Select all

premenna[0,0] = "Biela";
premenna[0,1] = "Čierna";
premenna[0,2] = "Červená";

premenna[1,0] = "Kristián";
premenna[1,1] = "Dominik";
premenna[1,2] = "Filip";

premenna[2,0] = "Slon";
premenna[2,1] = "Pes";
premenna[2,2] = "Mačka";
V tomto prípade si vieme jednoduchšie vyberať hodnoty z daných premenných, pretože si ich vieme zoradiť do "kategórie".


To je asi všetko ku poliam...
Nichar
Redaktor
Posts: 435
Joined: August 6, 2011, 1:51 pm
Facebook: http://www.facebook.com/nikolas.charalambidis
Location: Praha

Re: Premenné

Post by Nichar »

Ještě bych tam přidal dvoupolové arrays a příklad pro použití. Tutoriál je moc pěknej a přehlednej.. :)
The Scarecrow - 2. místo v prestižní soutěži, online highscore!
Symphony of good and evil: Finding the end - Soutěžní kousek (3. místo)
NWinAPI 0.2.gex | nMath.dll | nBeep.dll - Moje DLL a GEX
Vektorová galerie - Začátek mých vektorů
User avatar
Loric
Posts: 208
Joined: August 6, 2011, 9:01 am

Re: Premenné

Post by Loric »

Jen bych tě možná opravil, GM nemá 3 typy proměnných, ale jen 2 - string a real. Boolean není typ, ale je to pouze real. true a false jsou konstanty, které obsahují real proměnnou 1 a 0.

Jo a ještě by ses teda mohl o těch konstantách zmínit..
A taky pokud máme pole, např.:
prom[0] = 6;
prom[1] = 5;
atd..
tak prom = prom[0] = 6
ale to je uz jen detail :D
User avatar
Ap0
Redaktor
Posts: 370
Joined: August 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Location: zamiešany v malte
Contact:

Re: Premenné

Post by Ap0 »

Loric: Ano tiež ma to napadlo :D , ale keď som si o tom niečo prečítal aj tu:
http://cs.wikipedia.org/wiki/Boolean, a dočítal som sa že je to "hodnota typu boolean", tak si nie som celkom istý či sa to náhodou neberie ako tretí typ :|

A konštanty aj tie polia samozrejme môžem doplniť keď budem mať viac času, toto bolo tak trochu na rýchlo :sadp:
User avatar
Loric
Posts: 208
Joined: August 6, 2011, 9:01 am

Re: Premenné

Post by Loric »

No v jiných jazycích existuje boolean typ, ale v GM opravdu ne...
User avatar
Ap0
Redaktor
Posts: 370
Joined: August 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Location: zamiešany v malte
Contact:

Re: Premenné

Post by Ap0 »

OK, opravené :)
kost
Posts: 265
Joined: August 5, 2011, 10:48 pm

Re: Premenné

Post by kost »

Skvělý, přehledný tutoriál, který se bude nováčkům určitě hodit. :) Jen tak dál.
User avatar
jackm
Posts: 14
Joined: August 5, 2011, 10:48 pm
Facebook: http://facebook.com/
Location: Sever Čech
Contact:

Re: Premenné

Post by jackm »

Je to dobrý tutoriál a určitě přidej dvojrozměrné pole, aby to bylo kompletní.
Image
User avatar
Mikos
Posts: 233
Joined: August 6, 2011, 12:34 am

Re: Premenné

Post by Mikos »

Tak toto je fakt dobrý tutorial a na začiatok super, lebo bez premenných sa v programovaní ďaleko človek nepohne :)
User avatar
jiribocek
Posts: 159
Joined: August 5, 2011, 11:22 pm
Facebook: http://facebook.com/
Contact:

Re: Premenné

Post by jiribocek »

Nice Work, opravdu skvělé, podrobně popsané přímo do detailu. Klobouk dolů :3 :)
User avatar
Vojtas
Posts: 288
Joined: August 6, 2011, 5:19 pm
Facebook: http://www.facebook.com/#!/pro
Contact:

Re: Premenné

Post by Vojtas »

Konečně odpadne v poradně polovina dotazů... GW
Více o mně a mých "hrách" na twitteru: https://twitter.com/VojtaKoci
Budu rád, podíváte-li se i na můj nový blog o všeobecném dění a mých nejen herních projektech: http://vojtakoci.blogspot.cz/
User avatar
Knap98
Posts: 168
Joined: August 10, 2011, 3:22 pm
Facebook: http://facebook.com/

Re: Premenné

Post by Knap98 »

Na http://cs.wikipedia.org/wiki/Boolean sem přidal, jak se používá v GML ;)
Image
User avatar
Loric
Posts: 208
Joined: August 6, 2011, 9:01 am

Re: Premenné

Post by Loric »

správně se v gm bool neinvertuje pomcí operátoru - ale !. Sice když tam dáš -, tak to gm pobere, protoze kdyz je hodnota menší nebo rovno 0, tak se to rovná false, takže

Code: Select all

promenna0 = 1; // true
promenna0 = -promenna0; // -1 => false

promenna0 = 1;
promenna0 = !promenna0; // 0 => false
User avatar
Knap98
Posts: 168
Joined: August 10, 2011, 3:22 pm
Facebook: http://facebook.com/

Re: Premenné

Post by Knap98 »

Máš pravdu, dík za opravu
Image
User avatar
Diatrion
Posts: 21
Joined: February 2, 2012, 5:29 pm

Re: Premenné

Post by Diatrion »

Ohledně těch proměnných - mám jednu proměnnou a když jdu do jiného roomu a poté se zase vrátím do toho roomu s vykreslenou proměnou,všechno přičítání jde zase od začátku. Poradíte mi někdo, jak udržet chod proměnných, i když jdu do jiného roomu?
ereg
Posts: 500
Joined: February 18, 2012, 11:30 am
Facebook: http://facebook.com/

Re: Premenné

Post by ereg »

diatrion: tvuj dotaz patri do poradny. podivej se pomoci hledat nebo do help na presistant
pokud ti nebude stale jasne, napis dotaz do poradny. je vic zpusobu jak si pomoci.

mimochodem, mozna by bylo dobre zminit, ze true je vsechno co ma hodnotu vetsi nez 0
a false vsechno co ma hodnotu mensi nebo rovnou 0.

pisu o tom protoze i objekty, instance, ID, navraty funkci a pod. jsou taky zaroven hodnoty a mohou byt vyhodnoceny jako true/false.
staci jen ne/vhodne zvolit jmena promennych a clovek se divi proc nekdy program dela co ma a jindy vubec ne.

takto by mohl zacatecnik nabyt dojmu ze true/false je pouze 1/0 ( a pouze konstanta)
Last edited by ereg on July 23, 2012, 9:04 pm, edited 1 time in total.
Pokud se vám něco na fóru nelíbí, zkuste si přečíst třeba Wikietiketu a svou kritiku pišete podle ní.
User avatar
Ap0
Redaktor
Posts: 370
Joined: August 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Location: zamiešany v malte
Contact:

Re: Premenné

Post by Ap0 »

Diatrion wrote:Ohledně těch proměnných - mám jednu proměnnou a když jdu do jiného roomu a poté se zase vrátím do toho roomu s vykreslenou proměnou,všechno přičítání jde zase od začátku. Poradíte mi někdo, jak udržet chod proměnných, i když jdu do jiného roomu?
Podľa tvojho problému typujem že používaš globálne premenné, ale definuješ ju v :gmico127: Create nejakého objektu v prvej roomke. Tým pádom keď prejdeš do druhej miestnosti, hodnota ti ostane pretože je globálna, ale keď sa vrátiš, event :gmico127: Create ti zabezpečí že sa pri vytvorení toho objektu znova nastaví hodnota na pôvodnú.
Riešenie: Prestav si to z :gmico127: Create do :gmico134: Game Start
User avatar
Diatrion
Posts: 21
Joined: February 2, 2012, 5:29 pm

Re: Premenné

Post by Diatrion »

Opět zdravím. Potřeboval bych někoho, kdo by mi vysvětlil, jak používat závorky, příkazy typu if, then, atd... a taky prostě, jak s proměnnými podrobněji pracovat, co je příkaz, co podmínka atd. Nějak sem to nikde nevyčetl...
ereg
Posts: 500
Joined: February 18, 2012, 11:30 am
Facebook: http://facebook.com/

Re: Premenné

Post by ereg »

prace s promennymi predstavuje v podstate presun hodnot od nekud nekam.
Leva strana rovnitka(=) muze byt cokoli co je lhodnotou
prava strana rovnitka(=) muze byt cokolo co je phodnotou

lhodnota je promenna, funkce apod. ktere nemusi mit hodnotu, ale VZDY umi zapsat do sebe nejakou hodnotu prirazenou rovnitkem
phodnota je podobne jako lhodnota(muze do sebe umet zapsat nejakou hodnotu), ale ma VZDY nejakou hodnotu a tuto hodnotu pomoci rovnitka predava lhodnote.

lhodnotou nemuze napriklad byt konstanta, protoze z principu konstant nemuze zapsat do sebe zadnou hodnotu.
phodnoutou nemuze byt napr. funkce ktera nevraci zadnou hodnotu

pekny priklad je treba v pelpetove kodu:
o = instance_create(x+20*((sprite_index!=spr_hracL)*2-1),y,obj_strela);
lhodnota = phodnota(phodnota+phodnota*(phodnota!=phodnota)*phodnota-phodnota),phodnota,phodnota);
(phodnota!=phodnota) se hned vyhodnoti a stane se z ni phodnota.
takze radek dale vypada jednoduseji:
o = instance_create(x+20*(je_pravda_ze_hrac_je_otoceny_do_leva*2-1),y,obj_strela);
lhodnota = phodnota(phodnota+phodnota*phodnota*phodnota-phodnota),phodnota,phodnota);

takze lhodnota musi umet zapsat nejakou hodnotu sama do sebe.
a phodnota musi umet poskytnout hodnotu k zapsani

u podminky if gm dovoluje pouzit jedno = ale v jinych programech by misto porovnani lhodnoty a phodnoty doslo prirazeni phodnoty do lhodnoty a vyhodnoceni pravdivosti lhodnoty
x=1;
y=2;
z=0;
if x==y {z=1;} // je v poradku v GM, ale napr v C/C++ uz ne. v C/C by x=y se x=2 a podminka by mela hodnotu true coz je spatne, protoze 1 se nerovna 2 a z by se zmenilo na 1;
if x==y {z=1;} //je v poradku ve vetsine programu, protoze == znamena ze phodnota je na obou stranach a do phodnoty se nezapisuje( pouze do lhodnoty na leve strane =)

co se tyka formy if then v GM
v GM se da if napsat:
if a=b c=1 //kdyz se podminka splni vykona se 1 prikaz
ale osobne doporucuji pouzivat tento zapis
if a==b {c=1;} // kdyz se podminka splni vykona se blok prikazu
vsechno mezi {} je brane jako jeden blok prikazu.
blok prikazu se bere jako 1 prikaz a nezalezi kolik radku ma blok prikazu.

proc psat i 1 radek jako blok prikazu?
aby nahodou nedoslo k tomuto:
if auto==nabouralo auto.zivoty-=1; // ubere zivot
auto.x=start.x; //umisti na start
auto.y=start.y;

v tomto prikladu se neustale auto bude umistovat na start, protoze programator umisteni pridal na rychlo pozdeji a zapomnel vytvorit blok.
spravne mel napsat:
if auto==nabouralo {auto.zivoty-=1;} // ubere zivot

a rozsireni je pak proste
if auto==nabouralo {
auto.zivoty-=1; // ubere zivot
auto.x=start.x; //umisti na start
auto.y=start.y;
}


snad jsem to napsal trochu srozumitelne.

btw: jestli jsem se upsal tak mne nekamenujte
Pokud se vám něco na fóru nelíbí, zkuste si přečíst třeba Wikietiketu a svou kritiku pišete podle ní.
User avatar
Loric
Posts: 208
Joined: August 6, 2011, 9:01 am

Re: Premenné

Post by Loric »

Diatrion wrote:Opět zdravím. Potřeboval bych někoho, kdo by mi vysvětlil, jak používat závorky, příkazy typu if, then, atd... a taky prostě, jak s proměnnými podrobněji pracovat, co je příkaz, co podmínka atd. Nějak sem to nikde nevyčetl...
Jestli umíš anglicky, tak si otevři v GM nápovědu a tam si přečti kapitolu GML Language Overview a tam najdeš odpověď na svoje otázky.
Post Reply