Stránka 1 z 1

Přepis událostí do Stepu

Napsal: prosinec 30, 2013, 3:28 pm
od D-Sheep
 
Pokud s GameMakerem začínáte, nebo doposud používáte Drag&Drop ikonky, není tohle nic pro vás.
Tento seznam slouží jako návod, jak odchycovat určité časové okamžiky hry bez použití jim přiřazených událostí. Všechny náhrady jsou sestavěny jako konstrukce if ( ... ) v události Step.
Některé části kódu je nutné přepsat podle potřeby, např. v událostech s viewy atd. Pokud už máte s programováním určité zkušenosti, neměl by to pro vás být žádný problém. Pro vaše pohodlí je navíc kód srozumitelný a dobře čitelný.

Aktuální k verzi 8.0 Pro.
CREATE :gmico127:
Spoiler: ukázat
Jeden způsob, jak simulovat spuštění kódu pouze jednou je skrze nedeklarované proměnné, které programátorsky nejsou košer, ale GameMakeru zřejmě nevadí, protože pro jejich obsluhu dokonce poskytuje pár funkcí.

Kód: Vybrat vše

if ( !variable_local_exists( "_" ) )
    //Akce...
_ = 0; //Tímto deklarujeme proměnnou a zabráníme opakovanému spuštění bloku
Jméno takovéto proměnné může být libovolné.
DESTROY :gmico128:
Spoiler: ukázat
Nelze nahradit. Měl by to být poslední kód, který se spustí před zničením. To bohužel Step nedokáže, protože Destroy nemá určené pořadí a spustí se hned po zpracování události, ve které se volá instance_destroy(). Snad jediná možná náhrada je zkopírování kódu z této události všude tam, kde se má instance ničit.
ALARM :gmico136:
Spoiler: ukázat
S alarmy je problém v tom, že pokud není k alarmu přidružená událost definována, nespustí se odpočet a jeho hodnota zůstává celou dobu stejná. Mohli bychom tomu ovšem pomoci manuálním odečítáním jedničky v každém stepu.

Kód: Vybrat vše

if ( alarm[ <číslo> ] == 0 )
    //Akce...
alarm[ <číslo> ] -= 1;
STEP :gmico135:
Spoiler: ukázat
Tak tohle je myslím jasné a bez komentáře... Proč se sem vůbec díváte?
COLLISION :gmico126:
Spoiler: ukázat
Problém v tomto nahrazení je fakt, že se nedá použít klíčové slovo other a musíme ho nahradit také.

Kód: Vybrat vše

var i;
i = instance_place( x, y, <objekt> ); //i se nyní chová jako other
if ( i )
KEYBOARD :gmico130:
Spoiler: ukázat
KEYBOARD :gmico130:

Kód: Vybrat vše

if ( keyboard_check( <klávesa> ) )
KEY PRESS :gmico131:

Kód: Vybrat vše

if ( keyboard_check_pressed( <klávesa> ) )
KEY RELEASE :gmico132:

Kód: Vybrat vše

if ( keyboard_check_released( <klávesa> ) )
Způsobů, jak určovat konkrétní klávesy, je víc. Klávesy se speciálními funkcemi a znaky (Left, F1, Shift, atd.) mají v GameMakeru vyhrazené konstanty s předponou vk_, tedy píšeme např vk_space. Mezi tyto konstanty patří i vk_nokey a vk_anykey. Písmena a čísla však tyto konstanty nemají, protože by byly zbytečné. Místo toho nám pomůže funkce ord(), která převádí znaky na jejich ASCII kódy. Pro klávesu "A" tedy použijeme funkce takto: if ( keyboard_check( ord( "A" ) ) ). Pokud máte tendenci vše zkracovat na minimum, můžete samozřejmě natvrdo použít scankód dané klávesy.
MOUSE :gmico133:
Spoiler: ukázat
HOLD

Kód: Vybrat vše

if ( mouse_check_button( <tlačítko> ) && instance_position( mouse_x, mouse_y, object_index ) )
PRESSED

Kód: Vybrat vše

if ( mouse_check_button_pressed( <tlačítko> ) && instance_position( mouse_x, mouse_y, object_index ) )
RELEASED

Kód: Vybrat vše

if ( mouse_check_button_released( <tlačítko> ) && instance_position( mouse_x, mouse_y, object_index ) )
GLOBAL HOLD

Kód: Vybrat vše

if ( mouse_check_button( <tlačítko> ) )
GLOBAL PRESSED

Kód: Vybrat vše

if ( mouse_check_button_pressed( <tlačítko> ) )
GLOBAL RELEASED

Kód: Vybrat vše

if ( mouse_check_button_released( <tlačítko> ) )
Tlačítka se určují pomocí zabudovaných konstant mb_left, mb_right, mb_middle, mb_any, mb_none.


MOUSE ENTER, MOUSE LEAVE

Nahrazování těchto událostí se roztahuje přes více stepů hry, protože chceme sledovat časovou změnu nějaké proměnné. Osobně bych navrhoval nahradit to něčím jako MOUSE OVER, která prostě zjišťuje, zda je pod kurzorem daný objekt, nebo ne.

Kód: Vybrat vše

if ( instance_position( mouse_x, mouse_y, <objekt> ) )
MOUSE WHEEL UP

Kód: Vybrat vše

if ( mouse_wheel_up() )
MOUSE WHEEL DOWN

Kód: Vybrat vše

if ( mouse_wheel_down() )
JOYSTICK

To ještě někdo používá?
OTHER :gmico134:
Spoiler: ukázat
OUTSIDE ROOM

Kód: Vybrat vše

if ( x - sprite_xoffset + sprite_width < 0 ||
     x - sprite_xoffset >= room_width ||
     y - sprite_yoffset + sprite_height < 0 ||
     y - sprite_yoffset >= room_height )
INTERSECT BOUNDARY

Kód: Vybrat vše

if ( x - sprite_xoffset < 0 ||
     x - sprite_xoffset + sprite_width >= room_width ||
     y - sprite_yoffset < 0 ||
     y - sprite_yoffset + sprite_height >= room_height )
OUTSIDE VIEW

Kód: Vybrat vše

var v;
v = <číslo>;
if ( x - sprite_xoffset + sprite_width < view_xview[v] ||
     x - sprite_xoffset >= view_xview[v] + view_wview[v] ||
     y - sprite_yoffset + sprite_height < view_yview[v] ||
     y - sprite_yoffset >= view_yview[v] + view_hview[v] )
BOUNDARY VIEW

Kód: Vybrat vše

var v;
v = <číslo>;
if ( x - sprite_xoffset < view_xview[v] ||
     x - sprite_xoffset + sprite_width >= view_xview[v] + view_wview[v] ||
     y - sprite_yoffset < view_yview[v] ||
     y - sprite_yoffset + sprite_height >= view_yview[v] + view_hview[v] )
NO MORE LIVES

Kód: Vybrat vše

if ( lives <= 0 )
Pokud zabráníte takovým blbostem, jako je používání desetinného čísla jako počet životů, můžete použít i elegantnější

Kód: Vybrat vše

if ( !lives )
NO MORE HEALTH

Kód: Vybrat vše

if ( health <= 0 )
Předchozí dodatek platí i tady.

ANIMATION END

Kód: Vybrat vše

if ( image_index >= image_number - 1 )
END OF PATH

Kód: Vybrat vše

if ( path_position >= 1 )
DRAW :gmico129:
Spoiler: ukázat
V podsatě lze zcela nahradit, co se týče načasování, protože Draw i Step se vykonají v každém kroku hry. Pokud nám jde o funkci kreslení na obrazovku, můžeme použít funkci screen_refresh(). Draw je ale celkem klíčová událost a ani bych se ji radši nesnažil nahradit nečím jiným. Byly by z toho zbytečné potíže.
TRIGGER Obrázek
Spoiler: ukázat
Triggery jsou jedna z nejhloupějších součástí GameMakeru a lze je nahradit prostým zavoláním skriptu se stejným obsahem.

Kód: Vybrat vše

if ( <skript>() )

Re: Přepis událostí do Stepu

Napsal: prosinec 30, 2013, 7:32 pm
od Adamer
Doporucuju se vyhnout screen_refresh, pokud hru chcete pouzivat na ruznych platformach a aktualni verzi Game Makeru.

Re: Přepis událostí do Stepu

Napsal: prosinec 30, 2013, 8:45 pm
od Kešu
Od kdy nejde v GML "other"?

Re: Přepis událostí do Stepu

Napsal: prosinec 30, 2013, 10:13 pm
od D-Sheep
Zhruba od stejný chvíle, kdy ho začneš používat mimo Collision eventy. Začne se chovat jako self a nedostáváš z toho rozumný hodnoty.

Re: Přepis událostí do Stepu

Napsal: prosinec 30, 2013, 11:19 pm
od ipq
S tými joystickmi, neviem či sa náhodou nejedná o zapojené periférie k počítaču ako je gamepad či iné zariadenie pre herné účely. Raz som skúsil i Xbox 360, či ho dokáže zobrať a dokázal dokonca i nejaký iný nešpecifikovaný ale tuším len základné funkcie podporuje(šípky, triggery, analógové páčky a tlačidla, cez ten event len šípky a tlačidla), zvyšok ako sú vibrácie či pohybové senzory absolútne nie a hlavne nie bez prídavných knižníc čo som si všimol u niektorých emulátoroch ako problém, prečo ich nechcú zobrať kvôli určitým druhom driverov a knižníc(inými slovy, majú len určité knižnice na tie dané gamepady a zvyšok už nepoznajú).

Re: Přepis událostí do Stepu

Napsal: prosinec 31, 2013, 1:28 am
od Loric
Taky nemám problém s other. Funguje i s with.

Re: Přepis událostí do Stepu

Napsal: prosinec 31, 2013, 1:43 am
od DDL Blue
Draw je ale celkem klíčová událost a ani bych se ji radši nesnažil nahradit nečím jiným. Byly by z toho zbytečné potíže.
Hh tohle mě celkem pobavilo :). Mám teď celkem rozsáhlej projekt, ve kterým draw event úplně chybí, nikde se nevyskytuje :D. Dovoluje mi to (na GM) extrémní hodnoty FPS. (pokud se tomu tak dá říkat, když se většinou nic nevykresluje. SPS (step per second) by bylo asi výstižnější...)
Cause GM8 magic :lover: 8-) :D.

Jinak super tutoriál, tohle se vždycky někomu hodí ;).

Re: Přepis událostí do Stepu

Napsal: leden 1, 2014, 6:52 pm
od Pelpet
Ještě bych doplnil, že alarmy jsou v GM pitomé a aby se odpočítávaly, musí jejich event být nastavený. Řekněme, že v create nastavím alarm[0] třeba na 30. Ve stepu dám podmínku a do ní třeba show_message. Spustíte "hru" a ejhle - nic. Aby GM začal alarm počítat, musíte jeho událost stejně vytvořit a dát do ní něco. Třeba prázdný kód.

Nevím, jestli mám jen podělaný GM a nebo to dělá všem. Každopádně to byl důvod proč už delší dobu alarmy nepoužívám (ono current_time pracuje alespoň s časem. Jakmile není stálé FPS, alarm neměří přesně).

A s other taky nekamarádím. Taky mi to vrací self. Mám GM 8.0 Pro, ale kdo ví co se kde ...

Re: Přepis událostí do Stepu

Napsal: leden 2, 2014, 6:08 pm
od ipq
Pelpet: Toto by ma nikdy nenapadlo, že alarmy budú stáť, ak nebudú mať priradenú udalosť, nakoľko som stále ich používal na udalosť a nie na step. Až teraz som sa na to pozrel myslím si, že toto robia všetky verzie GMka, na koľko je určený iba na udalosť a nie na step a hlavne tím, že on sa riadi rýchlosťou roomu a nie reálneho času. Na hry využívajúci delta_time nieje vhodný, maximálne ako aktivátor udalosti, čo som tiež často používal i keď teraz je to schopný nahradiť trigger.

Re: Přepis událostí do Stepu

Napsal: leden 2, 2014, 7:14 pm
od DDL Blue
Já alarmy využíval vždycky jen s tím eventem. Pokud bych to chtěl kontrolovat jen ve stepu, udělám si vždycky vlastní proměnnou. Tu druhou možnot využívám nepoměrně častěji.

Re: Přepis událostí do Stepu

Napsal: leden 8, 2014, 12:25 am
od Peeter
Abych to uvedl na pravou míru:
Other funguje pouze v kolizním eventu. Když kontrolujete kolizi přes nějakou funkci, tak se other nepřiřadí.

Re: Přepis událostí do Stepu

Napsal: leden 8, 2014, 2:23 pm
od ipq
Neviem, či je to tak ale ja som raz používal other vo with, keď som chcel získať premennú s aktuálneho objektu do druhého ale potom som začal používať local miesto toho, keď som zistil že to vracalo id toho predchádzajúceho objektu takže ak som dal with do with vo with, už to s aktuálneho objektu nedokázalo získať hodnotu s premennej oproti local.