IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
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í.

1. diel - Naprogramujte arkanoid v GML

Podľa tohto tutoriálu naprogramujete hru Arkanoid v GML.

Sprity

Najskôr si načítame Sprites.

Sprity k Arkanoid - Game maker - GML
spr_stone_red - červená tehlička
spr_stone_blue - modrá tehlička
spr_stone_green - zelená tehlička
spr_live - sprite pre indikáciu života
spr_bat - sprite pálky
spr_ball - sprite lopty
spr_panel - sprite panelu, na ktorom sa budú zobrazovať herné informácie (score, životy, a pod.)
spr_bonus - sprite bonusov, ktoré môžu vypadnúť z tehličiek; všetky obrázky bonusov sú v tomto jednom sprite ako animácie
.<> spr_bonus - Game maker - GML

Tvorba objektov

Potom si vytvoríme objekty, ku ktorým priradíme jednotlivé sprites.

objects - Game maker - GML
obj_stone - tento objekt je rodičom všetkých tehličiek a nemusíme mu dávať žiadne sprite, pretože nebudeme ani vytvárať žiadne inštancie tohto objektu
obj_stone_red - potomok objektu obj_stone, ktorý dedí všetky jeho vlastnosti
obj_stone_blue - potomok objektu obj_stone, ktorý dedí všetky jeho vlastnosti
obj_stone_green - potomok objektu obj_stone, ktorý dedí všetky jeho vlastnosti
obj_bat - pálka
obj_ball - lopta
obj_bonus - objekt bonusu, ktorého inštancie sa bude náhodne vytvárať, ak bude kolízie lopty s tehličkami
obj_controller - objekt slúži pre kontrolovanie hry
obj_initializer - tu sa inicializujú globálne premenné
Ďalej ešte vytvoríme pozadia pozadia a font panel_font.

Miestnosti:

rooms - Game maker - GML

Vytvoríme miestnosti kam umiestnime obj_controller, pálku, loptu a tehličky. Veľkosť a počet miestností nechám na vás.

A hlavne nesmieme zabudnúť vytvoriť miestnosť, v ktorej bude obj_initializer, pre nastavenie globálnych premenných. Bez nich by sme totiž nemohli nikam ukladať životy alebo score.

Konštanty

A ako postúpime na písanie a popisovanie kódu, tak si definujeme konštanty, čo sú premenné, ktorých hodnoty sa nezmení za celú hru.

Definujeme ich tak, že si v menu otvoríme Resources → Define constants ... alebo stlačíme klávesovú skratku Ctrl + Shift + N a do tabuľky vložíme tieto konštanty:

  • MAX_LEVEL - hodnotu zvolíme takú, podľa toho, koľko máme vytvorených levelov
  • BONUS_SPEED - rýchlosť bonusu, ktorú bude padať
  • BALL_SPEED - rýchlosť lopty

Konštantám priradí nejakú hodnotu, a tú potom môžete počas testovania zmeniť, ak by vám nevyhovovala. (Napr. Pridáte ďalšie levely).

Ja som ich nastavil takto:

  • MAX_LEVEL = 3
  • BONUS_SPEED = 8
  • BALL_SPEED = 10

A tu je okomentovaný zdrojový kód pre 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šetko. Ešte si môžete stiahnuť zdrojový kód a ďalej hru vylepšovať. Ak ste niečo nepochopili, tak sa môžete pýtať dole v komentároch.

Screenshot

Arkanoid - Game maker - GML

 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 284x (30.07 kB)
Aplikácia je vrátane zdrojových kódov v jazyku GameMaker

 

Všetky články v sekcii
Game maker - GML
Článok pre vás napísal Drakeman
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování her v Game Makeru a Pythonu.
Aktivity