ITnetwork summer 2020
80 % bodů zdarma na online výuku díky naší Letní akci!
Pouze tento týden sleva až 80 % na e-learning týkající se PHP

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.

Návrh hry v Jave

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)
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!

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.


 

Stiahnuť

Stiahnuté 425x (5.67 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Programovanie jednoduchých Java GUI hier - Zoznamy
Všetky články v sekcii
Tvorba hier v Java Swing
Článok pre vás napísal vita
Avatar
Ako sa ti páči článok?
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity (1)

 

 

Komentáre

Avatar
BLADE
Člen
Avatar
BLADE:4.11.2013 12:03

Po prečítaní nadpisu som sa tešil na tutuoriál v ktorom bude automatické ukladanie :D , teda nechcem byť nevďačný super článok :) . No ak by sa ti chcelo mohol by si spraviť niečo jednoduché s ukladním a načítaním napríklad pozícií.

 
Odpovedať
4.11.2013 12:03
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovedá na BLADE
David Čápka:4.11.2013 12:43

Seriál vysvětluje hlavně jak kreslit na plátno a jak naprogramovat pohyb objektů. Ukládání a načítání pozici není pro hru nijak specifické a je vysvětleno v tutoriálech pro práci se soubory. Stačí si je přečíst :)

Editované 4.11.2013 12:43
Odpovedať
4.11.2013 12:43
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:14.9.2014 22:45

Děkuji za krásný seriál. Chtěl bych se zeptat v jakém programu jste vytvořili diagram s objekty který se nachází na začátku článku. Děkuji.

 
Odpovedať
14.9.2014 22:45
Tento výukový obsah pomáhajú rozvíjať nasledujúce firmy, ktoré možno hľadajú práve teba!
Avatar
vita
Redaktor
Avatar
Odpovedá na martinkobelka
vita:15.9.2014 14:24

Ahoj, jedná se o Violet UML Editor.

 
Odpovedať
15.9.2014 14:24
Avatar
berykubik
Redaktor
Avatar
berykubik:28.11.2014 10:27

Ahoj, chtěl jsem jenom upozornit, že v tom UML tutoriálu je ten diamand u agregace na špatné straně :-)

 
Odpovedať
28.11.2014 10:27
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 5 správy z 5.