Premenné

Sem vkládejte editovatelné kusy kódu a tutoriály.
Uživatelský avatar
Ap0
Redaktor
Příspěvky: 367
Registrován: srpen 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Bydliště: zamiešany v malte
Kontaktovat uživatele:

Premenné

Příspěvek od Ap0 » srpen 7, 2011, 8:12 pm

Č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ú:

Kód: Vybrat vše

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...

Kód: Vybrat vše

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.

Kód: Vybrat vše

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.

Kód: Vybrat vše

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ú:

Kód: Vybrat vše

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ť:

Kód: Vybrat vše

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:

Kód: Vybrat vše

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ť:

Kód: Vybrat vše

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:

Kód: Vybrat vše

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:

Kód: Vybrat vše

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:

Kód: Vybrat vše

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:

Kód: Vybrat vše

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ú:

Kód: Vybrat vše

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

Kód: Vybrat vše

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...

Kód: Vybrat vše

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.

Kód: Vybrat vše

draw_text(x,y,nahodne_meno);

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

Kód: Vybrat vše

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...

Uživatelský avatar
Nichar
Redaktor
Příspěvky: 435
Registrován: srpen 6, 2011, 1:51 pm
Facebook: http://www.facebook.com/nikolas.charalambidis
Bydliště: Praha

Re: Premenné

Příspěvek od Nichar » srpen 7, 2011, 8:18 pm

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ů

Uživatelský avatar
Loric
Příspěvky: 208
Registrován: srpen 6, 2011, 9:01 am

Re: Premenné

Příspěvek od Loric » srpen 7, 2011, 8:30 pm

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

Uživatelský avatar
Ap0
Redaktor
Příspěvky: 367
Registrován: srpen 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Bydliště: zamiešany v malte
Kontaktovat uživatele:

Re: Premenné

Příspěvek od Ap0 » srpen 7, 2011, 8:39 pm

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:

Uživatelský avatar
Loric
Příspěvky: 208
Registrován: srpen 6, 2011, 9:01 am

Re: Premenné

Příspěvek od Loric » srpen 7, 2011, 8:58 pm

No v jiných jazycích existuje boolean typ, ale v GM opravdu ne...

Uživatelský avatar
Ap0
Redaktor
Příspěvky: 367
Registrován: srpen 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Bydliště: zamiešany v malte
Kontaktovat uživatele:

Re: Premenné

Příspěvek od Ap0 » srpen 7, 2011, 9:02 pm

OK, opravené :)

Uživatelský avatar
kost
Příspěvky: 265
Registrován: srpen 5, 2011, 10:48 pm

Re: Premenné

Příspěvek od kost » srpen 7, 2011, 9:39 pm

Skvělý, přehledný tutoriál, který se bude nováčkům určitě hodit. :) Jen tak dál.

Uživatelský avatar
jackm
Příspěvky: 14
Registrován: srpen 5, 2011, 10:48 pm
Facebook: http://facebook.com/
Bydliště: Sever Čech
Kontaktovat uživatele:

Re: Premenné

Příspěvek od jackm » srpen 7, 2011, 10:03 pm

Je to dobrý tutoriál a určitě přidej dvojrozměrné pole, aby to bylo kompletní.
Obrázek

Uživatelský avatar
Mikos
Příspěvky: 233
Registrován: srpen 6, 2011, 12:34 am

Re: Premenné

Příspěvek od Mikos » srpen 8, 2011, 12:01 am

Tak toto je fakt dobrý tutorial a na začiatok super, lebo bez premenných sa v programovaní ďaleko človek nepohne :)

Uživatelský avatar
jiribocek
Příspěvky: 159
Registrován: srpen 5, 2011, 11:22 pm
Facebook: http://facebook.com/
Kontaktovat uživatele:

Re: Premenné

Příspěvek od jiribocek » srpen 8, 2011, 1:06 am

Nice Work, opravdu skvělé, podrobně popsané přímo do detailu. Klobouk dolů :3 :)

Uživatelský avatar
Vojtas
Příspěvky: 288
Registrován: srpen 6, 2011, 5:19 pm
Facebook: http://www.facebook.com/#!/pro
Kontaktovat uživatele:

Re: Premenné

Příspěvek od Vojtas » srpen 15, 2011, 2:01 pm

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/

Uživatelský avatar
Knap98
Příspěvky: 168
Registrován: srpen 10, 2011, 3:22 pm
Facebook: http://facebook.com/

Re: Premenné

Příspěvek od Knap98 » srpen 23, 2011, 3:06 pm

Na http://cs.wikipedia.org/wiki/Boolean sem přidal, jak se používá v GML ;)
Obrázek

Uživatelský avatar
Loric
Příspěvky: 208
Registrován: srpen 6, 2011, 9:01 am

Re: Premenné

Příspěvek od Loric » srpen 23, 2011, 3:39 pm

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

Kód: Vybrat vše

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

promenna0 = 1;
promenna0 = !promenna0; // 0 => false

Uživatelský avatar
Knap98
Příspěvky: 168
Registrován: srpen 10, 2011, 3:22 pm
Facebook: http://facebook.com/

Re: Premenné

Příspěvek od Knap98 » srpen 23, 2011, 3:47 pm

Máš pravdu, dík za opravu
Obrázek

Uživatelský avatar
Diatrion
Příspěvky: 21
Registrován: únor 2, 2012, 5:29 pm

Re: Premenné

Příspěvek od Diatrion » červenec 23, 2012, 10:08 am

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
Příspěvky: 500
Registrován: únor 18, 2012, 11:30 am
Facebook: http://facebook.com/

Re: Premenné

Příspěvek od ereg » červenec 23, 2012, 11:19 am

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)
Naposledy upravil(a) ereg dne červenec 23, 2012, 9:04 pm, celkem upraveno 1 x.
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í.

Uživatelský avatar
Ap0
Redaktor
Příspěvky: 367
Registrován: srpen 5, 2011, 11:24 pm
Facebook: http://facebook.com/
Bydliště: zamiešany v malte
Kontaktovat uživatele:

Re: Premenné

Příspěvek od Ap0 » červenec 23, 2012, 3:05 pm

Diatrion píše: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

Uživatelský avatar
Diatrion
Příspěvky: 21
Registrován: únor 2, 2012, 5:29 pm

Re: Premenné

Příspěvek od Diatrion » srpen 6, 2012, 10:50 am

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
Příspěvky: 500
Registrován: únor 18, 2012, 11:30 am
Facebook: http://facebook.com/

Re: Premenné

Příspěvek od ereg » srpen 6, 2012, 1:34 pm

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í.

Uživatelský avatar
Loric
Příspěvky: 208
Registrován: srpen 6, 2011, 9:01 am

Re: Premenné

Příspěvek od Loric » srpen 6, 2012, 1:57 pm

Diatrion píše: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.

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti