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í.

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 - Tvorba hier v Java Swing

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é 466x (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
Preskočiť článok
(neodporúčame)
Programovanie jednoduchých Java GUI hier - AutoHra pokračovanie
Článok pre vás napísal vita
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
vita
Aktivity