1. díl - Naprogramujte arkanoid v GML

Ostatní jazyky GameMaker GML Naprogramujte arkanoid v GML

Podle tohoto tutoriálu naprogramujete hru Arkanoid v GML.

Sprity

Nejdříve si načteme Sprites.

Sprity k arkanoidu
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
spr_bonus

Tvorba objektů

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

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

rooms

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

Arkanoid

 

Stáhnout

Staženo 259x (30.07 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

  Aktivity (1)

Článek pro vás napsal Drakeman
Avatar
Autor se věnuje programování her v Game Makeru a Pythonu.

Jak se ti líbí článek?
Celkem (4 hlasů) :
3.53.53.53.5 3.5


 



 

 

Komentáře

Avatar
TomBen
Redaktor
Avatar
TomBen:

Dohráno do konce. :-)

Je jasné, že je to vzor. V praxi by pak bylo dobré mít v každém levelu nějakou významnou odlišnost, včetně jiného rozmístění cihel a různých pozadí.
Na kód jsem moc nekoukal, ale myslím, že tam chybí omezení počtu životů. Srdíčka by mohly vylézt z obrazovky při více levelech. A když se schovává kurzor, dal bych jako default fullscreen. Když je totiž myš mimo okno, kurzor tam vesele poletuje a nevypadá to dobře. Jinak to bylo celkově příjemné, protože jsem arkanoid na spectru měl hrozně rád a tak jsem si ho zase připomněl. :-)

Odpovědět 27.5.2013 19:58
Za posledních 200 miliónů let se nic zvláštního nestalo, akorát dinosauři vymřeli a opice se naučily programovat.
Avatar
Drakeman
Redaktor
Avatar
Odpovídá na TomBen
Drakeman:

jj přesně tak. Udělal jsem to jenom jako takový vzor, a ten kdo se učí GML se může pokusit pochopit zdrojový kód, pohrát si s ním a různě jej zdokonalovat a vylepšovat :-)

Odpovědět 27.5.2013 20:04
Když se chce, tak jde všechno,
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.