12. diel - Programovanie jednoduchých Java GUI hier - AutoHra úvod
Teóriu máme za sebou. Teraz nás čaká naprogramovanie hry.
AutoHra
Najskôr si povieme, ako táto hra bude vyzerať a čo bude robiť. Vytvoríme si jednoduchý návrh toho, čo budeme programovať. Keďže jeden obrázok vydá za tisíc slov, návrh bude vizuálne. Chcem len upozorniť, že náš návrh nespĺňa úplne náležitosti UML diagramu. Ak sa chcete dozvedieť viac o tom, čo to UML je a ako môže programátorovi pomôcť, odporúčam výborný UML tutoriál tu na ITnetwork.
O hre
V hre bude hráč ovládať auto, s ktorým sa bude vyhýbať prekážkam. So zvyšujúcou sa náročnosťou hry (s pribúdajúcim časom) bude pribúdať prekážok. V prípade, že auto narazí do prekážky, hra končí a vypíše sa GAME OVER. Čím dlhšie hráč hrá, tým viac má bodov. Tie sa budú zobrazovať v ľavej hornej časti okna.
Naša hra sa bude skladať zo štyroch tried.
- AutoHra.java
- HerniPanel.java
- Prekazka.java
- Auto.java
AutoHra.java
Vstupný bod programu, trieda s metódou main. V tejto triede sa tiež vytvára hlavné okno programu.
HerniPanel.java
Táto trieda implementuje rozhranie ActionListener a má niekoľko premenných. Tie najdôležitejšie sú zobrazené v diagrame.
private boolean hrajeSe
True, v prípade, že hra pobeží. Ak auto narazí na prekážku, premenná bude mať hodnotu false.
private Auto auto
Odkaz na objekt typu Auto, ktorý hráč ovláda.
private List<Prekazka> prekazky
Zoznam všetkých prekážok.
Tie najdôležitejšie metódy sú nasledovné:
public void paintComponent(Graphics g)
a
public void actionPerformed(ActionEvent ae)
Metóda paintComponent () sa volá pri vykresľovanie JPanelu a actionPerformed () pri vzniku udalosti ActionEvent.
Prekazka.java
Tá má tieto dôležité premenné.
private HerniPanel panel
Odkaz (referencie) na HerniPanel.
private int x
Hodnota x-ovej súradnice daného objektu prekážka
private int y
Hodnota y-ovej súradnice. Jednoducho xay udávajú aktuálnu polohu (ľavý horný roh) danej prekážky
private int dy
Táto premenné uchováva smer pohybu na y-ovej osi (+ klesá dole, - stúpal by hore) a tiež rýchlosť (hodnota +1 napríklad znamená, že objekt prekážka klesá dole o 1px za cyklus).
private Image prekazkaObr
Premenná uchovávajúci odkaz na načítaný obrázok daného objektu. A teraz sa pozrieme na najdôležitejšie metódy
public void vykresliSe(Graphics g)
Táto metóda berie parameter grafický kontext a naň nakreslí aktuálnu prekážku (objekt Prekážkou na ktorom je volaná).
public void provedPohyb()
Ako názov napovedá, vykoná zmenu súradníc x, y.
public Rectangle getOkraje()
Vráti objekt Rectangle, ktorý reprezentuje okraje daného objektu. Vráti Rectangle, ktorý je na rovnakom umiestnení ako daný objekt prekážka.
public boolean isViditelny()
Vráti hodnotu premennej viditeľný.
Auto.java
Táto trieda implementuje rozhranie KeyListener a má nasledujúce dôležité premenné.
private HerniPanel panel
Odkaz na HerniPanel. Vďaka tomu má prístupu napríklad k metódam panelu getWidth () a getHeight (), pre zistenie výšky a šírky panelu.
private int x, y, dx
Aktuálne x-ová, y-ová súradnice a premenná pre smer a rýchlosť pohybu po osi x (dx = -2 by znanenalo, že objekt Auto mení počas každého cyklu (behu) pozíciu x-ovej súradnice o 2px = pohybuje sa doľava).
private Image autoObr
To isté čo u prekážky. Odkaz na obrázok, ktorý sa potom vykresľuje na JPanel.
Dôležité metódy.
public void vykresliSe()
Volá sa pomocou auto.vykresliSe (Graphics g) a na grafický kontext vykreslí obrázok autoObr na súradnice x, y.
public void provedPohyb()
Zmení súradnice x, y podľa toho, či je stlačená príslušná klávesa.
public Rectangle getOkraje()
Vráti Rectangle, na rovnakých súradniciach ao rovnakej veľkosti, akú zaberá obrázok autoObr.
public void keyPressed(KeyEvent ke)
Táto metóda sa volá pri stlačení klávesy na klávesnici.
public void keyReleased(KeyEvent ke)
Táto metóda sa volá pri pustení klávesy na klávesnici
Takto teda približne bude vyzerať naša hra. AutoHra.java sa skladá z HerniPanel.java. Ten je súhrnom Prekazka.java a Auto.java. Znovu sa pozrite na diagram. Malo by vám byť zhruba jasné ako bude program vyzerať.
Auto.java
package autoHra; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.ImageIcon; /** * Třída reprezentující auto. * @author vita */ public class Auto implements KeyListener { private HerniPanel panel; // reference na panel private Image autoObr; private int x; // x-ová souřadnice auta private int y; // y-ová souřadnice auta private int dx; // směr auta po ose x (+ doprava, - doleva) /** * Kontruktor třídy Auto * @param sirkaPanelu - šířka herní plochy */ public Auto(HerniPanel panel) { ImageIcon ii = new ImageIcon(this.getClass().getResource("auto.png")); autoObr = ii.getImage(); this.panel = panel; this.x = 185; // počáteční souřadnice x this.y = 558; // souřadnice y this.dx = 0; } /** * Vykreslí obrázek na aktuální souřadnice * @param g grafický kontext */ public void vykresliSe(Graphics g) { g.drawImage(autoObr, x, y, null); } /** * Změna x-ové souřadnice v daném směru. */ public void provedPohyb() { x += dx; if (x < 0) { x = 0; } else if (x > (panel.getWidth() - autoObr.getWidth(null) - 1) && (panel.getWidth() >0)) { x = panel.getWidth() - autoObr.getWidth(null) - 1; } } /** * Vrací obrys obrázku ve formě obdélníka. * @return Rectangle ve velikosti obrázku */ public Rectangle getOkraje() { Rectangle r = new Rectangle(x, y, autoObr.getWidth(null), autoObr.getHeight(null)); return r; } /** * Definuje činnost, která se provede po stisku klávesy na klávesnici. * @param e - KeyEvent */ @Override public void keyPressed(KeyEvent ke) { int key = ke.getKeyCode(); if (key == KeyEvent.VK_LEFT) { dx = -2; // směr doleva, rychlost 2px za vykreslení } if (key == KeyEvent.VK_RIGHT) { dx = 2; // směr doprava, rychlost 2px za vykreslení } } /** * Definuje činnost, která se provede po puštění stisknuté klávesy. * @param e - KeyEvent */ @Override public void keyReleased(KeyEvent ke) { dx = 0; } @Override public void keyTyped(KeyEvent ke) { } }
Prekazka.java
package autoHra; import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.util.Random; import javax.swing.ImageIcon; /** * Třída reprezentující překážku. * @author vita */ public class Prekazka { private HerniPanel panel; // reference na panel private Image prekazkaObr; private int x; private int y; private int dy = 1; // směr na ose y (dolů) a rychlost (1px za vykreslení) private boolean viditelny; // překážka je na panelu true, mimo panel false private Random generator; // generátor náhodných čísel /** * Konstruktor. * @param x x-ová souřadnice */ public Prekazka(HerniPanel panel) { ImageIcon ii = new ImageIcon(this.getClass().getResource("prekazka.png")); prekazkaObr = ii.getImage(); this.generator = new Random(); // vytvoření generátoru náhodných čísel this.panel = panel; // reference na panel this.x = generator.nextInt(panel.getWidth() - prekazkaObr.getWidth(null)); this.y = -50; // umístění překážky na ose y při vytvoření viditelny = true; } /** * Vykreslí obrázek na aktuální souřadnice * @param g grafický kontext */ public void vykresliSe(Graphics g) { g.drawImage(prekazkaObr, x, y, null); } /** * Změna y-ové souřadnice. Pokud dojede na konec panelu, změní se hodnota * viditelny na false. */ public void provedPohyb() { y += dy; if (y > panel.getHeight()) { viditelny = false; } } /** * Vrací obrys obrázku ve formě obdélníka. * @return Rectangle ve velikosti obrázku */ public Rectangle getOkreje() { Rectangle r = new Rectangle(x, y, prekazkaObr.getWidth(panel), prekazkaObr.getHeight(panel)); return r; } /** * Vrací zda je objekt visible či nikoli. * @return visible */ public boolean isViditelny() { return viditelny; } }
Kód tried AutoHra.java a HerniPanel.java si ukážeme v ďalšom diele.
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é 471x (5.67 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java