Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

Lekce 12 - Programování jednoduchých Java GUI her - AutoHra úvod

V předchozí lekci, Programování jednoduchých Java GUI her - Seznamy, jsme se blíže podívali na seznamy objektů a uvedli si třídu ArrayList.

Teorii máme za sebou. Nyní nás čeká naprogramování hry.

AutoHra

Nejdříve si řekneme, jak tato hra bude vypadat a co bude dělat. Vytvoříme si jednoduchý návrh toho, co budeme programovat. Jelikož jeden obrázek vydá za tisíc slov, návrh bude vizuální. Chci jen upozornit, že náš návrh nesplňuje zcela náležitosti UML diagramu. Pokud se chcete dozvědět více o tom, co to UML je a jak může programátorovi pomoci, doporučuji výborný UML tutoriál tady na ITnetwork.

Návrh hry v Javě - Tvorba her v Java Swing

O hře

Ve hře bude hráč ovládat auto, se kterým se bude vyhýbat překážkám. Se zvyšující se náročností hry (s přibývajícím časem) bude přibývat překážek. V případě, že auto narazí do překážky, hra končí a vypíše se GAME OVER. Čím déle hráč hraje, tím více má bodů. Ty se budou zobrazovat v levé horní části okna.

Naše hra se bude skládat ze čtyř tříd.

  • AutoHra.java
  • HerniPanel.java
  • Prekazka.java
  • Auto.java

AutoHra.java

Vstupní bod programu, třída s metodou main. V této třídě se také vytváří hlavní okno programu.

HerniPanel.java

Tato třída implementuje rozhraní ActionListener a má několik proměnných. Ty nejdůležitější jsou zobrazeny v diagramu.

private boolean hrajeSe

True, v případě, že hra poběží. Pokud auto narazí na překážku, proměnná bude mít hodnotu false.

private Auto auto

Odkaz na objekt typu Auto, který hráč ovládá.

private List<Prekazka> prekazky

Seznam všech překážek.

Ty nejdůležitější metody jsou následující:

public void paintComponent(Graphics g)

a

public void actionPerformed(ActionEvent ae)

Metoda paintComponent() se volá při vykreslování JPanelu a actionPerformed() při vzniku události ActionEvent.

Prekazka.java

Ta má tyto důležité proměnné.

private HerniPanel panel

Odkaz (reference) na HerniPanel.

private int x

Hodnota x-ové souřadnice daného objektu Prekazka

private int y

Hodnota y-ové souřadnice. Jednoduše x a y udávají aktuální polohu (levý horní roh) dané překážky

private int dy

Tato proměnné uchovává směr pohybu na y-ové ose (+ klesá dolů, - stoupal by nahoru) a také rychlost (hodnota +1 například znamená, že objekt Prekazka klesá dolů o 1px za cyklus).

private Image prekazkaObr

Proměnná uchovávající odkaz na načtený obrázek daného objektu. A teď se podíváme na nejdůležitější metody

public void vykresliSe(Graphics g)

Tato metoda bere parametr grafický kontext a na něj nakreslí aktuální překážku (objekt Prekazka na kterém je volána).

public void provedPohyb()

Jak název napovídá, provede změnu souřadnic x, y.

public Rectangle getOkraje()

Vrátí objekt Rectangle, který reprezentuje okraje daného objektu. Vrátí Rectangle, který je na stejném umístění jako daný objekt Prekazka.

public boolean isViditelny()

Vrátí hodnotu proměnné viditelny.

Auto.java

Tato třída implementuje rozhraní KeyListener a má následující důležité proměnné.

private HerniPanel panel

Odkaz na HerniPanel. Díky tomu má přístupu například k metodám panelu getWidth() a getHeight(), pro zjištění výšky a šířky panelu.

private int x, y, dx

Aktuální x-ová, y-ová souřadnice a proměnná pro směr a rychlost pohybu po ose x (dx = -2 by znanenalo, že objekt Auto mění během každého cyklu (běhu) pozici x-ové souřadnice o 2px = pohybuje se doleva).

private Image autoObr

Totéž co u překážky. Odkaz na obrázek, který se pak vykresluje na JPanel.

Důležité metody.

public void vykresliSe()

Volá se pomocí auto.vykresli­Se(Graphics g) a na grafický kontext vykreslí obrázek autoObr na souřadnice x, y.

public void provedPohyb()

Změní souřadnice x, y dle toho, zda je stisknuta příslušná klávesa.

public Rectangle getOkraje()

Vrátí Rectangle, na stejných souřadnicích a o stejné velikosti, jakou zabírá obrázek autoObr.

public void keyPressed(KeyEvent ke)

Tato metoda se volá při stisku klávesy na klávesnici.

public void keyReleased(KeyEvent ke)

Tato metoda se volá při puštění klávesy na klávesnici

Takto tedy přibližně bude vypadat naše hra. AutoHra.java se skládá z HerniPanel.java. Ten je souhrnem Prekazka.java a Auto.java. Znovu se podívejte na diagram. Mělo by vám být zhruba jasné jak bude program vypadat.

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 tříd AutoHra.java a HerniPanel.java si ukážeme v příštím díle.

V příští lekci, Programování jednoduchých Java GUI her - AutoHra pokračování, budeme pokračovat v naší AutoHře.


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 466x (5.67 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Programování jednoduchých Java GUI her - Seznamy
Všechny články v sekci
Tvorba her v Java Swing
Přeskočit článek
(nedoporučujeme)
Programování jednoduchých Java GUI her - AutoHra pokračování
Článek pro vás napsal vita
Avatar
Uživatelské hodnocení:
11 hlasů
vita
Aktivity