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 11 - Programování jednoduchých Java GUI her - Seznamy

V předchozí lekci, Programování jednoduchých Java GUI her - Detekce kolizí 2, jsme dokončili kolize objektů pomocí třídy Rectangle a metody Intersect.

V tomto díle se blíže podíváme na seznamy objektů.

Ještě bych se ale na chvíli vrátil k předchozí kapitole. Nastavování velikostí komponent v Javě není zcela průhledné. Doporučovaný způsob je nastavit preferovanou velikost komponentám a na závěr při vytváření okna zavolat metodu pack(). To nám většinou stačí. Pokud požadujeme přesnou velikost, je už to složitější.

Problém je, že preferovaná velikost nemusí být zcela dodržena. Proto v kódu používám metody getWidth() a getHeight(),které vrací aktuální velikost JPanelu. Pokud ale tyto metody zavolám při vytváření, vrací mi nulu. V předchozím příkladě jste si možná všimli, že úvodní pozici chytače zadávám napevno a v metodě move při kontrole souřadnic používám ještě podmínku && panel.getSIRKA_PA­NELU() > 0 (pro y je to obdobné)

if ((x >= panel.getSIRKA_PANELU() - (SIRKA + 1)) && (panel.getSIRKA_PANELU() > 0)) {

, aby mi x >= panel.getSIRKA_PA­NELU() - (SIRKA + 1) nepřepsala hodnotu x, pokud je SIRKA_PANELU rovna nule.

Seznamy

Ve hře budeme často potřebovat uložit proměnné množství objektů a k nim pak následně přistupovat. Uvedu příklad. Ve hře, budou útočit zlí mimozemšťané (málokdy jsou mimozemšťané hodní) a jejich počet se bude měnit v závislosti na úrovni hry a na tom, kolik jich sestřelíme. Určitě některé z vás napadlo, že by se dalo použít pole. S polem je ale ten problém, že má fixní délku. Pokud potřebujeme pole větší, musíme vytvořit pole nové a objekty z prvního pole do něj překopírovat. V opačném případě můžeme skončit s velikým polem, ale pouze pár objekty atd..

Řešením je použít pro ukládání měnícího se počtu objektů seznam - např. ArrayList. Práce s ním je jednoduchá.

Vytvoříme si třídu Nepřítel a pak třídu s metodou main (tento program nebude používat GUI, slouží pro ukázku práce s ArrayList).

Třída Nepřítel

public class Nepritel {
    /**
     * Jméno nepřítele.
     */
    private String jmeno;

    public Nepritel(String jmeno) {
        this.jmeno = jmeno;
    }

    /**
     * Vrátí jméno nepřítele.
     * @return jmeno
     */
    public String getJmeno() {
        return jmeno;
    }
}

Třída s metodou main

import java.util.ArrayList;

public class Seznamy {

    public static void main(String[] args) {

        ArrayList<String> seznamRetezcu = new ArrayList<String>();

        seznamRetezcu.add("Ahoj");
        seznamRetezcu.add("Nazdar");
        seznamRetezcu.add("Čau");

        System.out.println(seznamRetezcu.size());

        for (int i = 0; i < seznamRetezcu.size(); i++) {
            String retezec = seznamRetezcu.get(i);
            System.out.println(retezec);
        }

        seznamRetezcu.remove(1);
        System.out.println(seznamRetezcu.size());

        for (int i = 0; i < seznamRetezcu.size(); i++) {
            String retezec = seznamRetezcu.get(i);
            System.out.println(retezec);
        }

        System.out.println("----------------------");

        ArrayList<Nepritel> seznamNepratel = new ArrayList<Nepritel>();

        Nepritel n1 = new Nepritel("ZX12");
        Nepritel n2 = new Nepritel("YC21");

        seznamNepratel.add(n1);
        seznamNepratel.add(n2);
        seznamNepratel.add(new Nepritel("ZX574"));
        seznamNepratel.add(new Nepritel("FG669"));

        System.out.println(seznamNepratel.size());

        for (int i = 0; i < seznamNepratel.size(); i++) {
            Nepritel n = seznamNepratel.get(i);
            System.out.println(n.getJmeno());
        }

        seznamNepratel.remove(3);
        seznamNepratel.remove(n1);

        System.out.println(seznamNepratel.size());

        for (int i = 0; i < seznamNepratel.size(); i++) {
            Nepritel n = seznamNepratel.get(i);
            System.out.println(n.getJmeno());
        }
    }
}

Výsledek je následující.

List nepřátel v Javě - Tvorba her v Java Swing

Pojďmě se podívat na kód podrobněji. Třída nepřítel by měla být jasná. V konstruktoru přiřadíme do proměnné jmeno textový řetězec reprezentující název zlého mimozemšťana. Druhou a poslední metodou je getter (getJmeno()), kterou vracíme název nepřítele.

ArrayList<String> seznamRetezcu = new ArrayList<String>();

Vytvoříme prázdný seznam seznamRetezcu. Mezi menšítko a většítko (<>) uvádíme typ dat, které budeme do seznamu ukládat. Není to nutné, ale je to výhodné z toho důvodu, že překladači to umožňuje provádět kontrolu typu vkládaných dat a případnou chybu tedy odhalíme již při překladu programu a nikoli až při jeho běhu.

seznamRetezcu.add("Ahoj");
seznamRetezcu.add("Nazdar");
seznamRetezcu.add("Čau");

Do seznamu uložíme tři textové proměnné.

System.out.println(seznamRetezcu.size());

Zobrazíme počet položek (objektů) seznamu.

for (int i = 0; i < seznamRetezcu.size(); i++) {
    String retezec = seznamRetezcu.get(i);
    System.out.println(retezec);
}

Postupně procházíme objekty v seznamu. K objektům přistupujeme pomocí indexu (seznam.get(in­dex)).

seznamRetezcu.remove(1);
System.out.println(seznamRetezcu.size());

Ze seznamu odstraníme objekt na indexu 1 (seznam.remove(in­dex)) a zobrazíme počet položek po odebrání objektu.

for (int i = 0; i < seznamRetezcu.size(); i++) {
    String retezec = seznamRetezcu.get(i);
    System.out.println(retezec);
}

Opět projdeme objekty v seznamu a zobrazíme je. Pro seznamNepratel je to obdobné.

seznamNepratel.remove(3);
seznamNepratel.remove(n1);

System.out.println(seznamNepratel.size());

Nejdříve v seznamuNepratel odstraníme objekt na indexu 3. Pak odstraníme objekt, jehož referenci máme v proměnné n1. Nakonec takto upravený seznamNepratel zobrazíme.

List

Ještě bych se vrátil k deklaraci seznamu.

ArrayList<String> seznamRetezcu = new ArrayList<String>();

Vhodnější způsob je následující:

<code>List<String> seznamRetezcu = new ArrayList<String>();</code>

V tomto případě je potřeba ještě importovat java.util.List. List je rozhraní, které implementují seznamy v Javě jako například nám známý ArrayList, nebo třeba LinkedList. Proč tento způsob používat? Představte si, že píšete rozsáhlý program a máte v něm metodu

private ArrayList<String> seznam = new ArrayList<String>();

public ArrayList getSeznam() {
    return seznam;
}

a plno tříd, které používají seznam, získaný touto metodou. Pak ale zjistíte, že ArrayList vám nevyhovuje a budete ho chtít vyměnit např. za LinkedList. Ve všech třídách, které tento seznam používají, popřípadě metodách, které ho používají, budete muset přepsat ArrayList za LinkedList. Pokud ale motodu napíšete následovně

private List<String> seznam = new ArrayList<String>();

public List getSeznam() {
    return seznam;
}

provedete v celém svém programu jedinou změnu a to

private List<String> seznam = new LinkedList<String>();

Bonus

V programu ke stažení ještě naleznete tento kód:

Nepritel nepritelQW = new Nepritel("QW855");
Nepritel nepritelZZ = new Nepritel("ZZ221");

seznamNepratel.add(nepritelQW);

System.out.println("Je tam " + nepritelQW.getJmeno() + "? " + seznamNepratel.contains(nepritelQW));
System.out.println("Je tam " + nepritelZZ.getJmeno() + "? " + seznamNepratel.contains(nepritelZZ));

seznamNepratel.clear();
System.out.println("Je seznam prazdny? " + seznamNepratel.isEmpty());

Jedná se o ukázku dalších metod, které nabízí seznamy.

seznamNepratel.contains(nepritelQW)

Vrátí true, když seznam obsahuje daný objekt, jinak false.

seznamNepratel.clear();

Vyprázdní seznam.

seznamNepratel.isEmpty()

V případě, že seznam je prázný, vrátí true, jinak false.

A to je vše, co budeme pro práci se seznamy potřebovat, a také vše, co budeme potřebovat pro napsání první grafické hry v Javě, do které se pustíme v následujícím díle.

V příští lekci, Programování jednoduchých Java GUI her - AutoHra úvod, přistoupíme k samotnému programování hry.


 

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 196x (1.22 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Programování jednoduchých Java GUI her - Detekce kolizí 2
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 úvod
Článek pro vás napsal vita
Avatar
Uživatelské hodnocení:
9 hlasů
vita
Aktivity