Přepis událostí do Stepu

Sem vkládejte editovatelné kusy kódu a tutoriály.
Post Reply
User avatar
D-Sheep
Posts: 770
Joined: September 7, 2011, 10:17 pm
Facebook: http://facebook.com/sheepdave
Location: Praha, CZE
Contact:

Přepis událostí do Stepu

Post by 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:
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í.

Code: Select all

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

Code: Select all

if ( alarm[ <číslo> ] == 0 )
    //Akce...
alarm[ <číslo> ] -= 1;
COLLISION :gmico126:
Problém v tomto nahrazení je fakt, že se nedá použít klíčové slovo other a musíme ho nahradit také.

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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.

Code: Select all

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

Code: Select all

if ( mouse_wheel_up() )
MOUSE WHEEL DOWN

Code: Select all

if ( mouse_wheel_down() )
JOYSTICK
To ještě někdo používá?

OTHER :gmico134:
OUTSIDE ROOM

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

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

Code: Select all

if ( !lives )
NO MORE HEALTH

Code: Select all

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

ANIMATION END

Code: Select all

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

Code: Select all

if ( path_position >= 1 )
DRAW :gmico129:
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
Triggery jsou jedna z nejhloupějších součástí GameMakeru a lze je nahradit prostým zavoláním skriptu se stejným obsahem.

Code: Select all

if ( <skript>() )
Last edited by D-Sheep on March 7, 2021, 9:18 pm, edited 8 times in total.
Adamer
Posts: 202
Joined: August 5, 2011, 10:45 pm
Facebook: http://facebook.com/
Location: Humenné

Re: Přepis událostí do Stepu

Post by Adamer »

Doporucuju se vyhnout screen_refresh, pokud hru chcete pouzivat na ruznych platformach a aktualni verzi Game Makeru.
ImageImage
User avatar
Kešu
Posts: 393
Joined: August 6, 2011, 11:13 am
Facebook: https://www.facebook.com/kesucz
Location: Rakovník
Contact:

Re: Přepis událostí do Stepu

Post by Kešu »

Od kdy nejde v GML "other"?
Chytrákem od Ned 06. Pro 2009 22:29:46
▬▬▬▬▬▬▬▬▬▬▬▬▬ஜ۩۞۩ஜ▬▬▬▬▬▬▬▬▬▬▬▬
Still alive. - 22.5.2021
odditica.fyi
User avatar
D-Sheep
Posts: 770
Joined: September 7, 2011, 10:17 pm
Facebook: http://facebook.com/sheepdave
Location: Praha, CZE
Contact:

Re: Přepis událostí do Stepu

Post by 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.
User avatar
ipq
Posts: 929
Joined: August 15, 2011, 7:31 pm
Location: Petržalka

Re: Přepis událostí do Stepu

Post by 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ú).
User avatar
Loric
Posts: 208
Joined: August 6, 2011, 9:01 am

Re: Přepis událostí do Stepu

Post by Loric »

Taky nemám problém s other. Funguje i s with.
User avatar
DDL Blue
Živý stín
Posts: 431
Joined: August 6, 2011, 7:21 pm

Re: Přepis událostí do Stepu

Post by 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í ;).
Zkoukněte moji hudební galerii ;). Nebo vyzkoušej můj generátor akordů!
Řikejte mi prostě Blue...
Pelpet
Posts: 734
Joined: August 6, 2011, 12:03 am

Re: Přepis událostí do Stepu

Post by 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 ...
User avatar
ipq
Posts: 929
Joined: August 15, 2011, 7:31 pm
Location: Petržalka

Re: Přepis událostí do Stepu

Post by 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.
User avatar
DDL Blue
Živý stín
Posts: 431
Joined: August 6, 2011, 7:21 pm

Re: Přepis událostí do Stepu

Post by 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.
Zkoukněte moji hudební galerii ;). Nebo vyzkoušej můj generátor akordů!
Řikejte mi prostě Blue...
Peeter
' DROP TABLE 'vchforum'
Posts: 144
Joined: August 5, 2011, 10:51 pm
Facebook: http://facebook.com/

Re: Přepis událostí do Stepu

Post by 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í.
Image
User avatar
ipq
Posts: 929
Joined: August 15, 2011, 7:31 pm
Location: Petržalka

Re: Přepis událostí do Stepu

Post by 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.
Post Reply