IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

14. diel - Programovanie jednoduchých Java GUI hier - AutoHra vysvetlenie

Vysvetlenie kódu hry AutoHra. Pri spustení programu sa najskôr nájde metóda main (). Tá je v triede AutoHra.java

public static void main(String[] args) {
    AutoHra hlavniOkno = new AutoHra();

Tu sa vytvorí hlavné okno (zavolá sa konštruktor triedy AutoHra).

public AutoHra() {
    this.setTitle("AutoHra");
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    HerniPanel panel = new HerniPanel();

Titulok okna sa nastaví na AutoHra, nastaví sa tiež, čo sa má stať po kliknutí na krížik okná (zatvorenie). Vytvorí sa panel (zavolá sa konštruktor triedy HerniPanel). Najskôr sa však deklarujú premenné (niektoré rovno inicializujú).

private int sirkaPanelu = 400;
private int vyskaPanelu = 600;
private Timer casovac;
private Auto auto;
private boolean hrajeSe;
private int citac;
private int prodlevaMeziPrekazkami;
private List<Prekazka> prekazky;

public HerniPanel() {
    init();
    start();
}

V konstruktoru paneli je volaná metóda init ().

private void init() {
    this.setPreferredSize(new Dimension(sirkaPanelu, vyskaPanelu));
    this.setBackground(Color.black);
    this.setForeground(Color.white);
    this.setFont(new Font(Font.MONOSPACED, Font.BOLD, 20));
    this.setFocusable(true);
}

V nej sa nastavuje preferovaná veľkosť JPanelu, farba pozadia, farba popredia, písmo a tiež zamerania (focus). Metóda sa vykoná a činnosť sa vracia späť do konstruktoru. Po metóde init () nasleduje metóda štart ().

private void start() {
    hrajeSe = true;
    auto = new Auto(this);

Nastaví sa premenná hráš a zavolá sa konstruktoru triedy Auto.

private HerniPanel panel;
private Image autoObr;
private int x;
private int y;
private int dx;

public Auto(HerniPanel panel) {

    ImageIcon ii = new ImageIcon(this.getClass().getResource("auto.png"));
    autoObr = ii.getImage();

    this.panel = panel;
    this.x = 185;
    this.y = 558;
    this.dx = 0;
}

Načíta sa obrázok a vloží do premennej autoObr (do premennej sa uloží referencie na objekt typu Image, ktorý predstavuje obrázok auta). Konštruktor má jeden parameter a to odkaz na JPanel, ktorý ho zavolal. Parameter sme nazvali panel a uložíme ho do premennej panel objektu Auto (this.panel = panel). Nastavíme hodnoty premenným x, y, dx.

private void start() {
    ...
    auto = new Auto(this);
    citac = 0;
    prodlevaMeziPrekazkami = 100;
    prekazky = new ArrayList<Prekazka>();
    this.addKeyListener(auto);

    casovac = new Timer(10, this);
    casovac.start();
}

Konštruktor vykonal nadefinovanú činnosť a riadenie sa vracia späť do metódy štart (). Referencie (odkaz) na objekt typu Auto sa uloží do premennej auto, premenná čítač sa nastaví na nulu, prodleveMeziPre­kazkami na 100 a do premennej prekazky sa uloží odkaz na objekt typu ArrayList (volá sa konštruktor triedy ArrayList). Objekt Auto (odkaz na neho je v premennej auto) si panel zaregistruje ako poslucháča udalostí z klávesnice. Vytvorí sa objekt typu Timer a spustí sa (Timer si ako poslucháča registruje aktuálny objekt, v ktorom je vytváraný this = HerniPanel). Tým je ukončená metóda štart.

Riadenie sa vracia späť od konstruktoru triedy AutoHra.

public AutoHra() {
    ...
    this.add(panel);

    this.setResizable(false);
    this.pack();
}

Do okna je pridaný panel, okno sa nastaví tak, aby jeho veľkosť nešla meniť a volá sa metóda pack (), ktorá zistí veľkosti komponentov obsiahnutých v okne a zabalí okno okolo nich (prispôsobí veľkosť okna komponentom).

public static void main(String[] args) {
    AutoHra hlavniOkno = new AutoHra();
    hlavniOkno.setVisible(true);
}

Objekt typu AutoHra je vytvorený a odkaz na neho je uložený do premennej hlavniOkno. Potom je na tomto objekte zavolaná jeho metóda setVisible ().

@Override
public void paintComponent(Graphics g) {
    // pokud se hraje
    if (hrajeSe) {
        super.paintComponent(g);

        vypisCitac(g);
        auto.vykresliSe(g);

        for (int i = 0; i < prekazky.size(); i++) {
            Prekazka prek = prekazky.get(i);
            prek.vykresliSe(g);
        }
    }
    // pokud hra skončila
    else {
        vypisKonec(g);
    }
}

Až sa systém rozhodne, že je čas vykresliť komponenty (čo môže byť niekedy v čase, keď je volaná metóda JFrame.setVisible ()), je zavolaná metóda paintComponent (). Tá je automaticky volaná pri vzniku JPanelu (pri jeho prvotnom vykreslenie). Keďže premenná Hráš = true, prevedie časť v klauzule if. Vykreslí sa pozadie, zavolá sa metóda pre vypísanie (vykreslenie) stavu čítača, zavolá sa metóda vykreslíš objektu Auto, ktorá vykreslí obrázok na aktuálne súradnice a cyklus for neprebehne ani raz, pretože veľkosť zozname je nula.

Tak a máme zobrazenú aplikáciu. Aplikácia čaká. Teraz prichádza na rad Timer. Čo 10 milisekúnd vygeneruje udalosť typu ActionEvent a pošle ju registrovanému poslucháči (zavolá metódu actionPerformed () daného poslucháča). Ako poslucháč týchto udalostí je zaregistrovaný náš herný panel.

public void actionPerformed(ActionEvent ae) {

    citac++;

    auto.provedPohyb();
    pridejPrekazku();

Navýši čítač o jednotku, zavolá metódu provedPohyb na objekte, ktorého referencie je uložená v premennej auto, a ktorá vykoná zmenu súradníc (záleží na stlačeniam klávese). Zavolá metódu pre pridávanie prekážok.

private void pridejPrekazku() {
    if (citac == 1000) {
        prodlevaMeziPrekazkami = 70;
    }
    if (citac == 2000) {
        prodlevaMeziPrekazkami = 50;
    }
    if (citac == 3000) {
        prodlevaMeziPrekazkami = 40;
    }
    if (citac == 5000) {
        prodlevaMeziPrekazkami = 30;
    }
    if (citac == 7500) {
        prodlevaMeziPrekazkami = 20;
    }
    if (citac == 10000) {
        prodlevaMeziPrekazkami = 10;
    }

    if ((citac % prodlevaMeziPrekazkami) == 0) {
        Prekazka prek = new Prekazka(this);
        prekazky.add(prek);
    }
}

Tá podľa stavu čítača upraví premennú prodlevaMeziPre­kazkami a následne skontroluje, či zvyšok po delení čítača a prodlevaMeziPre­kazkami je nula (napr. 402% 200 = 2, 1000% 50 = 0). V prípade že áno, vytvorí objekt typu prekážky a referenciu na neho pridá do zoznamu.

public void actionPerformed(ActionEvent ae) {
    ...
    pohniPrekazkami();
    ...

Beh programu sa vracia späť do metódy actionPerformed a volá sa metóda pohniPrekazkami ().

private void pohniPrekazkami() {
    for (int i = 0; i < prekazky.size(); i++) {
        Prekazka prek = prekazky.get(i);
        prek.provedPohyb();
    }
}

Postupne prejde zoznamom a zavolá na každom objektu typu prekážky jeho metódu provedPohyb ().

public void actionPerformed(ActionEvent ae) {
    ...
    if (isSrazka()) {
        hrajeSe = false;
        casovac.stop();
    }

    odstranPrekazkyKtereJsouMimo();

    this.repaint();
}

Beh programu sa vracia späť do metódy actionPerformed. V podmienke if je volaná metóda isSrazka (), ktorá vracia true, v prípade, že došlo k stretu stíhača s niektorou prekážkou. Ak áno mení sa hodnota premennej hráš na false a zastaví sa časovač. Následne sa volá metóda, ktorá odstráni prekážky, ktoré sú mimo (ich premenná viditeľný = false). Ako posledný sa volá metóda prekreslenie (), ktorá okrem ďalších vecí volá metódu paintComponent (). Tá v závislosti na stave premenné hráš vykoná vykreslenie.

Vyššie uvedené sa vykonáva dovtedy, kým je časovač (Timer) v činnosti.


 

Predchádzajúci článok
Programovanie jednoduchých Java GUI hier - AutoHra pokračovanie
Všetky články v sekcii
Tvorba hier v Java Swing
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity