12. díl - Programování jednoduchých Java GUI her - AutoHra úvod

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

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

Návrh hry v Javě

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.


 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal vita
Avatar
vita

Jak se ti líbí článek?
Celkem (2 hlasů) :
4.54.54.54.54.5


 



 

 

Komentáře

Avatar
BLADE
Člen
Avatar
BLADE:

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

 
Odpovědět 4.11.2013 12:03
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na BLADE
David Čápka:

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 :)

Editováno 4.11.2013 12:43
Odpovědět 4.11.2013 12:43
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
martinkobelka
Redaktor
Avatar
martinkobelka:

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.

 
Odpovědět 14.9.2014 22:45
Avatar
vita
Redaktor
Avatar
Odpovídá na martinkobelka
vita:

Ahoj, jedná se o Violet UML Editor.

 
Odpovědět 15.9.2014 14:24
Avatar
berykubik
Člen
Avatar
berykubik:

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

 
Odpovědět 28.11.2014 10:27
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.