Pravidla Ucet
Nepřihlášen

Článek

Menu

GML - Tipy a triky
Napsal: NicharCZ
Přidáno: 01.02. 2012

Také v GML je spousta zajímavých vychytávek a zkratek. Člověk se s tím může setkat, tak by bylo dobré si je prohlédnout :)


Přepínání - proměnná dvou hodnot

Máme třeba vypínač, kde se určuje, jestli je rozsvíceno nebo ne (true; false). Každý by klasicky porovnával v jakým stavu je vypínač a při kliknutí mu přidal hodnotu jinou:

Left mouse click
if rozsviceno==true {rozsviceno=false}
else
if rozsviceno==false {rozsviceno=true}

Tohle všechno můžeme narvat do jedné akce:

rozsviceno=!rozsviceno

Kde se hodnota změní na opačnou. :) Snad chápete. Jdeme dál..


Zrcadlově převrácený sprite

Klasicky by asi řešil dalším obrázkem. Proč, když můžeme kódem?!

image_xscale=-1 //Převrácení podle x-osy
image_yscale=-1 //Převrácení podle y-osy

Jednoduché, ne? :) Samozřejmě hodnota nemusí být vždy jen -1. Když tam hodíte např. 2 tak se dvojnásobně zvětší a osově převrátí.


Zkracování operací s proměnnými

Tohle už každý asi zná z návodů na proměnné, ale raději to sem dám, protože to taky patří ke zkrácenému zápisu.

x=x-5 //Je to samé jako
x-=5

Přičítání proměnné jednou akcí

Někteří lidé to tak požívají, někteří ne. Ukážu vám, jak proměnnou nechat jednoduše narůst do stovky:

if x<100 {x+=1} //Je to samé jako
x+=(x<100)

V závorce je podmínka, která vrací hodnotu bool (0 nebo 1). K proměnné jen přičteme podmínku: takže když x je pod sto -> podmínka je rovna jedné a je co přičítat. Jakmile dosáhne hodnota 100, tak je podmínka 0, protože neplatí, takže logicky se už nic nepřičte :)

Takhle můžeme přepínat proměnnou v rozsahu třeba 0 až 10:

x+=(keyboard_check_pressed(vk_up) && (x<10)) - (keyboard_check_pressed(vk_down) && (xx>0));

Jedná se pouze o kombinaci logických prvků. Všimněte si, že funkce keyboard_check nevrací nic jiného, než bool hodnotu (0,1) a s tím se dá dál pracovat.

Tento způsob je pomalejší než klasický způsob s "if". Proto následné používání ve velkém množství nechám na vás. Ovšem, žádný citelný rozdíl to opravdu není.



Je tu toho opravdu málo. Pokud i vy máte něco zajímavého, napište mi to přes SZ na fórku (NicharCZ) a já to sem postnu pod vaším jménem i s poděkováním.. :) Ostatní redaktoři také mohou doplnit. Případné chyby prosím piště do komentářů.

Klíčová slova: gml game maker language kód kódy skript script tip tipy trik triky
 

Komentáře:

Napsal: NicharCZ
Přidáno: 03.10. 2012

Je fakt, že si neuvědomuji, které řešení je rychlejší. Já osobně to používám pokud je to jediný příkaz. Na druhou stranu, když mám více příkazů a více podmínek, ak jedu klasicky s "if". Komentáře typu "prasácký" nebo "odstašující" prosím vynechte ;) Odstraňovat to rozhodně nehodlám, z prostého důvodu. Začátečník to uvidí a ví prd, co to dělá. Na vaše žádosti přidám doplňující info.

Trvalý odkaz

Napsal: Hnidopich
Přidáno: 28.09. 2012

if(x<100)x+=1 není ani zdaleka to samé jako x+=(x<100), rozhodně to nemá co dělat v tutorialech pro začátečníky, který to tady uviděj a budou to používat. Zrovna tady musím vysvětlovat kolegoj, jaká je x+=(x<100) příšerná prasečina. Opravte prosím článek, nebo ho alespoň označte jako odstrašující příklad :-)

Trvalý odkaz

Napsal: Frooxius
Přidáno: 23.09. 2012

NicharCZ: To není tak úplně pravda, ono to není jiný způsob zápisu, ono je to v podstatě jiný kód, který se sice chová stejně, ale má jiné důsledky a je i pomalejší.

Je třeba si uvědomit, co vlastně ten kód skutečně dělá.

Pokud napíšeš

if x<100 {x+=1}

Tak to nejprve provede vyhodnocení výrazu "x<100", kdy výsledkem je nějaká boolean hodnota (pravda či nepravda), která se následně použije k rozhodnutí, jestli spustit kód, který provádí přičítání hodnoty k proměnné.

Když ale napíšeš

x+=(x<100)

Tak se opět nejprve vyhodnotí výraz "x<100", jenže kód na přičítání se spustí vždycky. Když je x menší jak 100, tak hodnota výrazu bude "true", čemuž odpovídá číslo "1", jinak "false" čemuž odpovídá číslo 0. Problém je, že v obou případech se bude operace sčítání spouštět. Tzn. dokud bude menší jak 100, tak se bude přičítat jednička a pak dokola pořád nula. Tzn. budeš v podstatě zbytečně pořád přičítat nulu k té samé proměnné (přičíst nulu trvá stejně jako jedničku, či jakékoli jiné číslo stejného datového typu), dokola a dokola a úplně zbytečně, kdežto u první verze se kód přičítání přestane zcela spouštět a v tom je ten podstatný rozdíl, proto bych se zásady tu druhou metodu nepoužíval. Další zákeřná věc se kterou by jsi se mohl setkat u jiných jazyků a prostředí je, že true se nemusí rovnat jedničce, ale čemukoliv nenulovému, třeba i 255, takže by jsi skončil s x = 255 ale to už je trochu mimo téma.

Trvalý odkaz

Napsal: NicharCZ
Přidáno: 08.07. 2012

Prasácký? Ne, ne.. Je to jenom další způsob zápisu. Každý si může vybrat, který mu sedne. Uvádím to, protože je to méně častý způsob, a někomu by mohl vyhovovat. Já se přiznám, že ho používám jen občas. Prasácký rozhodně není..

Trvalý odkaz

Napsal: tNRevan
Přidáno: 26.06. 2012

no ja nevim, napr. x+=(x<100) je docela prasacky. Rekl bych, ze diky citelnosti by bylo lepsi se tomu vyhnout

Trvalý odkaz

Napsal: DDL Blue
Přidáno: 02.11. 2011

Chyba v názvu opravena...

Trvalý odkaz

Velkej Chytrák
Copyright (c) 2001-2010