Přepis událostí do Stepu

Sem vkládejte editovatelné kusy kódu a tutoriály.
Odpovědět
Uživatelský avatar
D-Sheep
Příspěvky: 768
Registrován: září 7, 2011, 10:17 pm
Facebook: http://facebook.com/sheepdave
Bydliště: Praha, CZE
Kontaktovat uživatele:

Přepis událostí do Stepu

Příspěvek od D-Sheep » prosinec 30, 2013, 3:28 pm

 
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>() )
Naposledy upravil(a) D-Sheep dne srpen 2, 2015, 5:32 pm, celkem upraveno 7 x.

Uživatelský avatar
Adamer
Příspěvky: 202
Registrován: srpen 5, 2011, 10:45 pm
Facebook: http://facebook.com/
Bydliště: Humenné

Re: Přepis událostí do Stepu

Příspěvek od Adamer » prosinec 30, 2013, 7:32 pm

Doporucuju se vyhnout screen_refresh, pokud hru chcete pouzivat na ruznych platformach a aktualni verzi Game Makeru.
ObrázekObrázek

Uživatelský avatar
Kešu
Příspěvky: 393
Registrován: srpen 6, 2011, 11:13 am
Facebook: https://www.facebook.com/kesucz
Bydliště: Rakovník
Kontaktovat uživatele:

Re: Přepis událostí do Stepu

Příspěvek od Kešu » prosinec 30, 2013, 8:45 pm

Od kdy nejde v GML "other"?
Chytrákem od Ned 06. Pro 2009 22:29:46
▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬
Still alive. - 15.4.2017
blokatt.net

Uživatelský avatar
D-Sheep
Příspěvky: 768
Registrován: září 7, 2011, 10:17 pm
Facebook: http://facebook.com/sheepdave
Bydliště: Praha, CZE
Kontaktovat uživatele:

Re: Přepis událostí do Stepu

Příspěvek od D-Sheep » prosinec 30, 2013, 10:13 pm

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.

Uživatelský avatar
ipq
Příspěvky: 921
Registrován: srpen 15, 2011, 7:31 pm
Bydliště: Petržalka

Re: Přepis událostí do Stepu

Příspěvek od ipq » prosinec 30, 2013, 11:19 pm

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

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

Re: Přepis událostí do Stepu

Příspěvek od Loric » prosinec 31, 2013, 1:28 am

Taky nemám problém s other. Funguje i s with.

Uživatelský avatar
DDL Blue
Živý stín
Příspěvky: 431
Registrován: srpen 6, 2011, 7:21 pm

Re: Přepis událostí do Stepu

Příspěvek od DDL Blue » prosinec 31, 2013, 1:43 am

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í ;).
Zkoukněte moji hudební galerii ;). Nebo vyzkoušej můj generátor akordů!
Řikejte mi prostě Blue...

Uživatelský avatar
Pelpet
Příspěvky: 734
Registrován: srpen 6, 2011, 12:03 am
Bydliště: Vsetín
Kontaktovat uživatele:

Re: Přepis událostí do Stepu

Příspěvek od Pelpet » leden 1, 2014, 6:52 pm

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 ...
Obrázek Sunken Bridge | Obrázek Moje GM tutoriály | Come on son, let's go outside play Catch the Exception!

Uživatelský avatar
ipq
Příspěvky: 921
Registrován: srpen 15, 2011, 7:31 pm
Bydliště: Petržalka

Re: Přepis událostí do Stepu

Příspěvek od ipq » leden 2, 2014, 6:08 pm

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.

Uživatelský avatar
DDL Blue
Živý stín
Příspěvky: 431
Registrován: srpen 6, 2011, 7:21 pm

Re: Přepis událostí do Stepu

Příspěvek od DDL Blue » leden 2, 2014, 7:14 pm

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.
Zkoukněte moji hudební galerii ;). Nebo vyzkoušej můj generátor akordů!
Řikejte mi prostě Blue...

Uživatelský avatar
Peeter
' DROP TABLE 'vchforum'
Příspěvky: 144
Registrován: srpen 5, 2011, 10:51 pm
Facebook: http://facebook.com/

Re: Přepis událostí do Stepu

Příspěvek od Peeter » leden 8, 2014, 12:25 am

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í.
Obrázek

Uživatelský avatar
ipq
Příspěvky: 921
Registrován: srpen 15, 2011, 7:31 pm
Bydliště: Petržalka

Re: Přepis událostí do Stepu

Příspěvek od ipq » leden 8, 2014, 2:23 pm

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.

Odpovědět

Kdo je online

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