Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Lekce 1 - Naprogramujte arkanoid v GML

Podle tohoto tutoriálu naprogramujete hru Arkanoid v GML.

Sprity

Nejdříve si načteme Sprites.

Sprity k arkanoidu - GameMaker - GML
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 - GameMaker - GML

Tvorba objektů

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

objects - GameMaker - GML
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 - GameMaker - GML

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 - GameMaker - GML

 

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 283x (30.07 kB)
Aplikace je včetně zdrojových kódů v jazyce GameMaker

 

Všechny články v sekci
GameMaker - GML
Článek pro vás napsal Drakeman
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje programování her v Game Makeru a Pythonu.
Aktivity