1. diel - Naprogramujte arkanoid v GML
Podľa tohto tutoriálu naprogramujete hru Arkanoid v GML.
Sprity
Najskôr si načítame Sprites.
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 |
Tvorba objektov
Potom si vytvoríme objekty, ku ktorým priradíme jednotlivé sprites.
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é |
Miestnosti:
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; }
//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
//nastavíme globální proěnné, lives je vestavěná globální proměnná global.level = 1; lives = 3; room_goto_next();
//zneviditelní kurzor myši
window_set_cursor(cr_none);
//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(); }
//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();
Screenshot
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