Lekce 1 - Naprogramujte arkanoid v GML
Podle tohoto tutoriálu naprogramujete hru Arkanoid v GML.
Sprity
Nejdříve si načteme Sprites.

spr_stone_red | - červená cihlička |
spr_stone_blue | - modrá cihlička |
spr_stone_green | - zelená cihlička |
spr_live | - sprite pro indikaci života |
spr_bat | - sprite pálky |
spr_ball | - sprite míče |
spr_panel | - sprite panelu, na kterém se budou zobrazovat herní informace (score, životy, apod.) |
spr_bonus | - sprite bonusů, které mohou vypadnout z cihliček; všechny obrázky bonusů jsou v tomto jednom sprite jako animace |

Tvorba objektů
Potom si vytvoříme objekty, ke kterým přiřadíme jednotlivé sprites.

obj_stone | - tento objekt je rodičem všech cihliček a nemusíme mu dávat žádné sprite, protože nebudeme ani vytvářet žádné instance tohoto objektu |
obj_stone_red | - potomek objektu obj_stone, který dědí všechny jeho vlastnosti |
obj_stone_blue | - potomek objektu obj_stone, který dědí všechny jeho vlastnosti |
obj_stone_green | - potomek objektu obj_stone, který dědí všechny jeho vlastnosti |
obj_bat | - pálka |
obj_ball | - míč |
obj_bonus | - objekt bonusu, jehož instance se bude náhodně vytvářet, pokud bude kolize míče s cihličkou |
obj_controller | - objekt slouží pro kontrolování hry |
obj_initializer | - zde se inicializují globální proměnné |
Dále ještě vytvoříme pozadí background a font panel_font.
Místnosti:

Vytvoříme místnosti kam umístíme obj_controller, pálku, míč a cihličky. Velikost a počet místností nechám na vás.
A hlavně nesmíme zapomenout vytvořit místnost, ve které bude obj_initializer, pro nastavení globálních proměnných. Bez nich bychom totiž nemohli nikam ukládat životy nebo score.
Konstanty
A než postoupíme k psaní a popisování kódu, tak si definujeme konstanty, což jsou proměnné, jejichž hodnoty se nezmění za celou hru.
Definujeme je tak, že si v menu otevřeme Resources → Define Constants… nebo stiskneme klávesovou zkratku Ctrl+Shift+N a do tabulky vložíme tyto konstanty:
- MAX_LEVEL – hodnotu zvolíme takovou, podle toho, kolik máme
vytvořených levelů
- BONUS_SPEED – rychlost bonusu, kterou bude padat
- BALL_SPEED – rychlost míče
Konstantám přiřadte nějakou hodnotu, a tu pak můžete během testování změnit, pokud by vám nevyhovovala. (např. přidáte další levely).
Já jsem je nastavil takto:
- MAX_LEVEL = 3
- BONUS_SPEED = 8
- BALL_SPEED = 10
A zde je okomentovaný zdrojový kód pro každý objekt
obj_bat - Step:
//Pálku ovládáme pomocí myši, takže podle toho kde je myš na pozici x, tak tam je i pálka x = mouse_x; //Zabránění, aby pálka opustila místnost if(x <= 0){ x = 0; } if(x+sprite_width >= room_width){ x = room_width-sprite_width; }
obj_ball - Step:
//Slouží pro spuštění na začátku hry if(speed == 0){ if(mouse_check_button_pressed(mb_any)){ motion_set(90, BALL_SPEED); } } //odraz od stěny vlevo if(x < 0){ if(direction == 0 or direction == 180){ direction = 40; } x = 0; hspeed = -hspeed; } //odraz od stěny vpravo if(x > room_width-sprite_width){ if(direction == 0 or direction == 180){ direction = 140; } x = room_width-sprite_width; hspeed = -hspeed; } //odraz od stěny nahoře if(y <= 0){ vspeed = -vspeed; } //vypočítá kde je spodní okraj tak, že odečte výšku panelu a míče od celkové výšky místnosti bottom = room_height-sprite_get_height(spr_panel)-sprite_height; //kontroluje jestli se míč nedotknul spodní stěny if(y >= bottom){ lives -= 1; room_restart(); }
obj_ball - collision with obj_stone:
//míč se odrazí od cihličky //když je argument true, tak se odrazí do strany i když letí kolmo move_bounce_all(true) //vygeneruje náhodné číslo rand = round(random(7)); //a když se rovná čtyřem, tak se vytvoří bonus if(rand == 4){ with(other){ instance_destroy() instance_create(x,y,obj_bonus); } } else { with(other){ instance_destroy() } }
obj_ball - collision with obj_bat:
//míč se odrazí od pálky move_bounce_all(true)
obj_stone – Destroy:
//přičte score po zničení cihličky score += 10
obj_initializer – Create:
//nastavíme globální proěnné, lives je vestavěná globální proměnná global.level = 1; lives = 3; room_goto_next();
obj_controller – Create:
//zneviditelní kurzor myši
window_set_cursor(cr_none);
obj_controller – Step:
//kontroluje, jestli jsme nestiskli klávesu R //pokud ano, tak restartuje hru if(keyboard_check_pressed(ord('R'))){ game_restart(); } //kontroluje jestli jsou v místnosti ještě nějaké cihličky //když nejsou, tak přejde do dalšího levelu if!(instance_exists(obj_stone)){ if(global.level == MAX_LEVEL){ show_message("Úspěšně jsi dokončil všechny levely :-)"); game_end(); }else{ global.level += 1; room_goto_next(); show_message("Level: "+string(global.level)); } } // kontroluje životy a případně restartuje hru if(lives == 0){ show_message("Prohrál jsi!!! Hraješ zase od začátku."); game_restart(); }
obj_controller – Draw:
//vypočítá y souřadnici, kde se má vykreslit panel y = room_height - sprite_get_height(spr_panel); //vykreslí panel draw_sprite(spr_panel,-1,0,y); //nastaví font a vykreslí životy a score draw_set_font(panel_font); draw_text(50, y+15, "SCORE: "+string(score)); //score je číslo a tak jej musíme převést na string draw_text(300, y+15, "LIVES:"); //vykreslí spr_live, podle toho, kolik má hráč životů for(i=0; i<lives; i+=1){ draw_sprite(spr_live, -1, (320+sprite_get_width(spr_live)*i)+50, y+10); }
obj_bonus – Create:
//spr_bonus je animace, takže hned na začátku musíme nastavit, aby se nepřehrávala //a náhodně nastavíme, který obrázek bonusu chceme image_speed = 0; image_index = floor(random(5)); vspeed = BONUS_SPEED; obj_Bonus – Step: //když je bonus mimo místnost tak už jej nepotřebujeme :-) if(y > room_height){ instance_destroy(); }
obj_Bonus – Collision with obj_bat:
//pomocí switche naprogramujeme co se má stát, když se bonus dotkne pálky switch (image_index) { case 0: lives += 1; break; case 1: score += 100; break; case 2: score += 200; break; case 3: instance_change(obj_ball, false); break; case 4: sleep(100); room_restart(); break; } instance_destroy();
Tak to je vše. Ještě si můžete stáhnout zdrojový kód a dále hru vylepšovat. Pokud jste něco nepochopili, tak se můžete ptát dole v komentářích.
Screenshot

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 284x (30.07 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker