The Remote Pumpkin



Game Maker jednoduše [díl 4.] - Doplňky plošinové hry

iconV minulém díle jsem ukázal banální, ale funkční kód na plošinovku, který mi poskytl celkem dobrý základ a tak tentokrát ukážu spousty možných doplňků a vychytávek, jako třeba výtah, poloprůchodné bloky atd.
Úvodem
Tento díl plynule navazuje na ten předchozí, kdy jsem popsal tvorbu primitivní skákačky. Tentokrát k ní doděláme další doplňky jako blok proskočitelný zespodu, výtah, led, zpomalovací blok, nebo lano. Základ skákačky z minula jsem mírně poupravil, protože bude potřeba horizontální rychlost. Vzhledem k tomu, že má být tutoriál pro ty alespoň částečně pokročilejší, dovolím si nezabývat se detaily, pouze stručně popsat změny a pokračovat rychle dál.

// gravitace
v = min(max(v + g, -vx), vx);
if (place_meeting(x, y, oRope)) v = min(v, s);
repeat (abs(v)) if (place_free(x, y + sign(v))) y += sign(v); else {v = 0; break;}

// horizontalni pohyb
var sm, dcc;
sm = (keyboard_check(vk_right) - keyboard_check(vk_left)) * s / (
1 + place_meeting(x, y + 1, oSlow));
dcc =
.5 / (1 + place_meeting(x, y + 1, oIce) * 3);
if (abs(sm - h) > dcc) h += sign(sm - h) * dcc; else h = sm;

// pohyb
repeat (abs(h)) if (place_free(x + sign(h), y)) x += sign(h); else break;
if (keyboard_check(vk_up)) {
if (place_meeting(x, y, oRope)) {
v = -g;
repeat (s) if (place_free(x, y - 1) && place_meeting(x, y, oRope)) y -= 1; else break;
}
else if (!place_free(x, y + 1)) v = -j;
}
• V oddílu gravitace přibyla podmínka pro pohyb na provaze. viz. níže: provaz

• Proměnná h nyní stojí pro horizontální rychlost. Do proměnné sm se spočítá rychlost, jaká by měla být a podle toho se proměnná h plynule mění. Rychlost těchto změn se řídí podle toho, na jakém povrchu stojíte. Opět viz. níže: zpomalovací blok a námraza

• Při stisku šipky nahoru již nemusíte pouze skočit. Přibývá zde možnost lana. Zde je pohyb nahoru po laně naprogramován.

Polopropustný blok
Mám tím na mysli kostku, kterou proskočíte zespodu, ale můžete na ní z vrchu stát. Vzhledem k tomu, jak je řešený pohyb u hráče nám stačí pouze ovládat solid. V tomto případě je dobré udělat podmínku tak, že je blok solidní ve všech případech a solidní přestane být jen tehdy, má li objekt hráče negativní vertikální rychlost (letí vzhůru), nebo pokud objekt koliduje s blokem a zaseknul by se, kdyby byl blok solidní, nebo když hráč stiskne šipku dolů:
solid = !(
oPlayer.v <
0 ||
(oPlayer.y + oPlayer.sprite_height > y && oPlayer.x + oPlayer.sprite_width > x &&
oPlayer.x < x + sprite_width) ||
keyboard_check(vk_down)
);
(Tento kód patří do stepu objektu polopropustného bloku.)

Námraza a zpomalovací blok
Námrazou myslím blok, na kterém hráč klouže. Nemění to jeho rychlost, ale rozebíhá se delší dobu a taktéž brzdí déle. Prostě klouže... V samotném objektu není třeba nic programovat. Zpomalovací blok je ten, po kterém když postava jde, jde pomalu, poloviční rychlostí. Oba tyto objekty budou solidní, poslouží však jen na design roomů. Změny nastanou v objektu hráče, opět ve stepu. Konkrétně zde:
var sm, dcc;
sm = (keyboard_check(vk_right) - keyboard_check(vk_left)) * s / (
1 + place_meeting(x, y + 1, oSlow));
dcc =
.5 / (1 + place_meeting(x, y + 1, oIce) * 3);
if (abs(sm - h) > dcc) h += sign(sm - h) * dcc; else h = sm;
• Do proměnné sm vždy spočítám rychlost, kterou mám běžet. Maximální rychlost je uložena v proměnné s. Podle toho, jak hráč mačká, či nemačká šipky doprava a doleva se proměnná s násobí -1, 0 a nebo 1. To mění směr pohybu. Změna je na konci výpočtu. Pokud hráč stojí na zpomalovací kostce, vydělí se výsledná rychlost 2.

• Do proměnné dcc spočítáme něco jako tření. Za normálních podmínek bude 0.5, pokud však stojíme na objektu oIce, vydělí se toto číslo 0.5 / (1 + 3) = 0.125. To zajistí, že na náledí se bude hráč rozebíhat a zpomalovat značně déle, než normálně.

• Zbývá již jen přepočítat rychlost tak, aby bylo vše připraveno k pohybu. Pokud je rozdíl mezi rychlostí, kterou má objekt dosáhnout a rychlostí, kterou má menší, než je tření, může se rovnou nastavit na rychlost, kterou má mít. Pokud však je rozdíl větší, změní se rychlost h o tolik, kolik je v proměnné dcc směrem k sm.

Lano
Objekt lana je opět naprogramován v objektu hráče. Tento objekt nebude solidní! Objekt lana nám opět pouze poslouží pro tvorbu roomů. Co je tedy třeba změnit v objektu hráče? Tentokrát se to týká stepu na dvou místech: nejprve v oddílu s gravitací, kde přibyde řádek, který ošetřuje lezení po laně dolů. protože kdyby tam nebyl, objekt by neklesal stálou rychlostí, ale jednoduše padal, protože objekt lana není solidní.
// gravitace
v = min(max(v + g, -vx), vx);
if (place_meeting(x, y, oRope)) v = min(v, s);
repeat (abs(v)) if (place_free(x, y + sign(v))) y += sign(v); else {v = 0; break;}
Ve chvíli, kdy se aplikuje gravitace na vertikální rychlost, musíme to gravitaci překazit a nastavíme vertikální rychlost na rychlost pohybu. Tím se zajistí stejnoměrný pohyb dolů. V momentě, kdy se z lana uhne, gravitace zas funguje normálně. Druhá změna ale bude delší, než jeden řádek. Protože pohyb nahoru už je horší...
if (keyboard_check(vk_up)) {
if (place_meeting(x, y, oRope)) {
v = -g;
repeat (s) if (place_free(x, y - 1) && place_meeting(x, y, oRope)) y -= 1; else break;
}
else if (!place_free(x, y + 1)) v = -j;
}
• Pokud hráč stiskne šipku nahoru a koliduje s objektem lana, nastaví se vertikální rychlost v na -g. Tím opět přerušíme gravitaci. Proměnná g se k vertikální rychlosti každý step přičte. Pokud se však k -g přičte g, výsledek je nula.

• Následuje cyklus. Pokud je volné místo a stále jsme na laně, pohybujeme se vzhůru. Pokud narazíme, nemá cenu dál zjišťovat, jestli se tam to místo náhodou nevytvořilo, protože nevytvořilo - ukončíme cyklus, break;

• Pokud však nekolidujeme s lanem, necháme objekt vyskočit... to je již z původního kódu. viz. minulý díl.

Výtah
To nejlepší na konec! Výtah je totiž většinou oříšek pro většinu lidí, alespoň jejich skákačky to vypovídají. Přitom to není zas až tak těžké... V první řadě je potřeba nějak ošéfovat pohyb. Já ho vyřešil tak, že se výtah pohybuje nahoru a dolu a v momentě, kdy narazí na solidní blok, změní směr. Problém nastane, když ale jedete na výtahu nahoru a nad vámi je přichystán solidní objekt. Je tedy potřeba vytvořit si další objekt, který nebude solidní, na který bude reagovat pouze výtah. Stačí si vytvořit další objekt. Já ho pojmenoval oStop... V create výtahu si pouze nadefinujeme jeho rychlost. Opět využiji krátký název a rychlost zase pojmenuji s.
s = 4; // rychlost vytahu
Co se výtahu týče, bude i nebude solidní. Podobně jako u polopropustného bloku budeme toto ovládat ve stepu výtahu.
solid = (oPlayer.y + oPlayer.sprite_height <= y && !keyboard_check(vk_down));

argument0 = id;
argument1 = sign(s);
repeat (abs(s)) {
if (!place_free(x, y + argument1) || place_meeting(x, y + argument1, oStop)) { // kontrola pohybu vytahu
s *= -1;
argument1 *= -
1;
}
y += argument1;
// pohnout s vytahem
with (oPlayer) // pohnout s hracem
if (place_meeting(x, y + 2, argument0) && y + sprite_height + argument1 <= argument0.y)
if (place_free(x, y + argument1))
y += argument1;
}
• Výtah bude solidní, pokud na něj skočíme z vrchu. Také pokud hráč stiskne šipku dolů, propadne výtahem k zemi.

• Protože není potřeba zakládat další globální proměnné, proč nepoužít vestavěné proměnné argument0 a argument1? Potřebujeme objektu hráče totiž odeslat ID výtahu a také směr, kam se má pohybovat, stojí-li na něm.

• Potom spustíme cyklus, opět aby jsme docílili na pixel přesnou kolizi. Pokud narazí na solidní blok, nebo na oStop (viz. výše), změní svůj směr. Následně se pohne výtah.

• Potom se v objektu hráče spustí podmínka, která zjistí, stojíme-li na výtahu. Možná se někteří divíte, proč ve funkci place_meeting nepřičítám pouze jeden pixel? jednoduchá odpověď - když jede výtah dolů, vytvoří mezi hráčem a výtahem 1px mezera a kdybychom přičetli pouze 1px, hráč by nejel dolů díky výtahu, ale díky gravitaci a na výtahu by poskakoval! No a pokud se splní všechny podmínky, hráč se pohne ve směru výtahu.

• Pokud hráč narazí na solidní blok, jednoduše se nepohne s výtahem, což vypne podmínku ošetřující, zda-li je výtah solidní a hráč z výtahu nedobrovolně sesedne.

*.gmk + náhled
Znovu připomínám, že grafika v ukázce není volně šířitelná. Není jisté, zda-li ji nepoužiju někdy v budoucnu v nějaké hře a proto dávám grafiku pouze pro ukázku! Nepoužívejte ji nikde bez mého svolení!


« Předchozí díl seriáluDalší díl seriálu »


323 shlédnutí
Publikoval Pelpet před 8 lety

Komentáře (3)



Captcha

Další téma bych chtěl shop nebo-li obchod
Napsal ProXy před 8 lety
Super! Jen tak dál!!! Podle mě 3. a tento díl jsou jedny z nejlepších návodů na skákačky vůbec!!
Napsal Rizz před 8 lety
Líbí se vám tutoriály? Prosím, napište svůj názor zde, do komentářů, budeme rádi Můžete také navrhnout téma dalších dílů!
Napsal Pelpet před 8 lety
©2012 The Remote Pumpkin