Greenfoot

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Řešení situací: Změna obrázku přesunuta do teorie.)
(Vrácení změny obrázku aktéra jako samostatné kapitoly)
Řádka 9: Řádka 9:
 
== Princip ==
 
== Princip ==
 
* Vzhled hry popisuje třída, která musí být potomkem třídy <code>World</code>. Předpokládejme, že se bude jmenovat <code>HraWorld</code>, ale název si můžeme vymyslet.
 
* Vzhled hry popisuje třída, která musí být potomkem třídy <code>World</code>. Předpokládejme, že se bude jmenovat <code>HraWorld</code>, ale název si můžeme vymyslet.
* Na hrací ploše jsou aktéři, kteří jsou potomky třídy <code>Actor</code>.
+
* Na hrací ploše jsou aktéři (''actor'').
 +
* Chování aktérů je popsáno třídami, které jsou potomky třídy <code>Actor</code>.
 
* Aktéři jsou vizuálně zastoupeni obrázkem, který vybíráme při vytvoření třídy aktéra.
 
* Aktéři jsou vizuálně zastoupeni obrázkem, který vybíráme při vytvoření třídy aktéra.
 
; Průběh hry:
 
; Průběh hry:
Řádka 25: Řádka 26:
  
  
== Vytváření Actorů ==
+
== Vytváření aktérů ==
 
; Příprava instance actora
 
; Příprava instance actora
 
* Prvky ve hře (postavy atd.) jsou třídy, které jsou potomky třídy <code>Actor</code>.
 
* Prvky ve hře (postavy atd.) jsou třídy, které jsou potomky třídy <code>Actor</code>.
Řádka 61: Řádka 62:
 
         this.setLocation(cilX, cilY);
 
         this.setLocation(cilX, cilY);
 
     }
 
     }
 +
 +
 +
== Změna obrázku aktéra ==
 +
Ke změně obrázku slouží metody:
 +
Actor.setImage(GreenfootImage novyObrazek)
 +
Actor.setImage(String cestaKNovemuObrazku)
 +
 +
Pokud zadáme cestu k obrázku, obrázek se hledá v podsložce <tt>images</tt> složky s&nbsp;projektem.
 +
 +
; Příklad 1) Otočení vlevo či vpravo
 +
class Panacek extends Actor
 +
    GreenfootImage imgVlevo = new GreenfootImage("imgVlevo.png");
 +
    // ...
 +
    public void act() {
 +
        // ...
 +
        if (Greenfoot.isKeyDown("left")) {
 +
            this.setLocation(this.getX()-1, this.getY());
 +
            this.setImage(imgVlevo);
 +
        }
 +
        // ...
 +
    }
 +
}
  
  
Řádka 106: Řádka 129:
 
** Vrací čísla z množiny {0, 1, ..., limit-1}.
 
** Vrací čísla z množiny {0, 1, ..., limit-1}.
  
== Zjištění kolize prvků ve hře ==
 
  
 +
== Zjištění kolize prvků ve hře ==
 
* Ke zjištění kolizí slouží metody ve třídě <tt>Actor</tt>, které se jmenují <code>get...Object...</code>.
 
* Ke zjištění kolizí slouží metody ve třídě <tt>Actor</tt>, které se jmenují <code>get...Object...</code>.
 
* Metod je hodně, ale chovají se podobně.
 
* Metod je hodně, ale chovají se podobně.
Řádka 133: Řádka 156:
 
* intersecting objects ... objekty, které se prolínají se stávajícím (došlo ke kolizi)
 
* intersecting objects ... objekty, které se prolínají se stávajícím (došlo ke kolizi)
 
* objects at offset ... objekty, které jsou v dané vzdálenosti (dx, dy) od stávajícího objektu
 
* objects at offset ... objekty, které jsou v dané vzdálenosti (dx, dy) od stávajícího objektu
 +
  
 
== Řešení typických situací ==
 
== Řešení typických situací ==
=== Zdi ===
 
 
=== Rušení aktérů ===
 
=== Rušení aktérů ===
 
; Příklad 1) Zrušení kolidujících actorů
 
; Příklad 1) Zrušení kolidujících actorů
Řádka 159: Řádka 182:
  
 
=== Výpis stavu hry, hlášky ===
 
=== Výpis stavu hry, hlášky ===
 
 
Pro výpis skóre vytváříme nového speciálního „actora“ (objekt). Protože bude počitadlo pro celý projekt nejspíš jedno (nebo třeba jedno pro každého hráče), využijeme s výhodou [[Návrhové vzory#Jedináček|návrhový vzor Jedináček (Singleton)]].
 
Pro výpis skóre vytváříme nového speciálního „actora“ (objekt). Protože bude počitadlo pro celý projekt nejspíš jedno (nebo třeba jedno pro každého hráče), využijeme s výhodou [[Návrhové vzory#Jedináček|návrhový vzor Jedináček (Singleton)]].
  
Řádka 209: Řádka 231:
  
 
Lze samozřejmě do počitadla přidat informaci o aktuálním počtu bodů a tu pak zvyšovat nebo snižovat dle potřeby.
 
Lze samozřejmě do počitadla přidat informaci o aktuálním počtu bodů a tu pak zvyšovat nebo snižovat dle potřeby.
 +
 +
=== Zdi ===
 +
  
 
== Úkol: Zkuste si vytvořit hru! ==
 
== Úkol: Zkuste si vytvořit hru! ==

Verze z 20. 10. 2015, 07:15


Obsah

Co je to Greenfoot?

Dokumentaci tříd najdete na adrese:


Princip

Průběh hry
  1. Vytvoří se instance třídy HraWorld (resp. jak jsme nazvali svého potomka třídy World).
  2. Spustí se konstruktor třídy HraWorld.
  3. A dále se opakuje:
    1. Zavolá se metoda act() na svět (potomka třídy HraWorld).
    2. Zavolá se metoda act() pro všechny aktéry.


Nastavení parametrů světa

Nastavení pozadí hrací plochy
World.setBackground(GreenfootImage obrazek)


Vytváření aktérů

Příprava instance actora
Umístění instance na plochu
Odstranění actora z plochy


Nastavení pozice aktéra

Máme dvě varianty ovládání prvku (actora):

Relativní pozicování
Absolutní pozicování
Příklad
vytvoření metody move(int dx, int dy)
   public void act() 
   {
       this.move(3,-1);
   }
   
   private void move(int dx, int dy) {
       int cilX = this.getX()+dx;
       int cilY = this.getY()+dy;
       this.turnTowards(cilX, cilY);
       this.setLocation(cilX, cilY);
   }


Změna obrázku aktéra

Ke změně obrázku slouží metody:

Actor.setImage(GreenfootImage novyObrazek)
Actor.setImage(String cestaKNovemuObrazku)

Pokud zadáme cestu k obrázku, obrázek se hledá v podsložce images složky s projektem.

Příklad 1) Otočení vlevo či vpravo
class Panacek extends Actor
    GreenfootImage imgVlevo = new GreenfootImage("imgVlevo.png");
    // ...
    public void act() {
        // ...
        if (Greenfoot.isKeyDown("left")) {
            this.setLocation(this.getX()-1, this.getY());
            this.setImage(imgVlevo);
        }
        // ...
    }
}


Reakce na klávesy

Stisk klávesy (napsání písmenka)

String Greenfoot.getKey()

Příklad
Pohyb podle kláves
String vstup = Greenfoot.getKey();
if (vstup != null) {
   if (vstup.equals("right")) {
      this.setRotation(0);
   } else if (vstup.equals("left")) {
      this.setRotation(180);
   } else if (vstup.equals("up")) {
      this.setRotation(-90);
   } else if (vstup.equals("down")) {
      this.setRotation(90);
   }
   this.move(1);
}

Detekce, zda uživatel drží klávesu

boolean Greenfoot.isKeyDown(String klavesa)


Náhodná čísla

Standardní řešení Javy
Řešení Greenfootu


Zjištění kolize prvků ve hře

Výběr třídy
List<Actor> seznam = this.getIntersectingObjects(null); 
List<Zradlo> seznam = this.getIntersectingObjects(Zradlo.class);
Návratová hodnota
getOneIntersectingObject(class)
getOneObjectAtOffset(int dx, int dy, class)
private void vyresKolidujici() {
   List<Actor> seznam = this.getIntersectingObjects(null); 
   for (Actor prvek : seznam) {
      prvek.aplikuj(this);
   }
}
Filtr


Řešení typických situací

Rušení aktérů

Příklad 1) Zrušení kolidujících actorů
private void act() {
   // ...
   World svet = this.getWorld();
   List<Actor> seznam = this.getIntersectingObjects(null); 
   for (Actor prvek : seznam) {
      prvek.aplikuj(this);
      svet.removeObject(prvek);
   }
Příklad 2) Zrušení aktéra, který vyjel mimo obrazovku na levém okraji
public void act() {
    // ...
    if (this.getX() < 1) {
        World svet = this.getWorld();
        if (svet != null) {
            this.getWorld().removeObject(this);
        }
    }
}

Výpis stavu hry, hlášky

Pro výpis skóre vytváříme nového speciálního „actora“ (objekt). Protože bude počitadlo pro celý projekt nejspíš jedno (nebo třeba jedno pro každého hráče), využijeme s výhodou návrhový vzor Jedináček (Singleton).

public class Pocitadlo extends Actor
{
    // Implementace Jedináčka:
    private static Pocitadlo prvniHrac = null;
    public static Pocitadlo getInstance() {
        if (this.prvniHrac == null) 
            this.prvniHrac = new Pocitadlo();
        }
        return this.prvniHrac;
    }
    
    // A zbytek kódu:
    private int stav;
    
    private Pocitadlo() { // private kvůli Jedináčkovi
        this.setStav(0);
    }
    public void setStav(int stav) {
        this.stav = stav;
        String text = "Skóre: "+this.stav;
        GreenfootImage obrazek = new GreenfootImage(text, 20, Color.yellow, Color.gray);
        this.setImage(obrazek);
    }
    public void zmenStav(int zmena) {
        this.setStav(this.stav+zmena);
    }
}

Na plochu počítadlo přidáme:

public HraWorld() {
    ...
    this.addObject(Pocitadlo.getInstance(), 20, 20);
    ...
}

Změnu skóre pak kdekoli v projektu můžeme vyvolat:

...
Pocitadlo.getInstance().setStav(10);
...

nebo

...
Pocitadlo.getInstance().zmenStav(-2);
...

Lze samozřejmě do počitadla přidat informaci o aktuálním počtu bodů a tu pak zvyšovat nebo snižovat dle potřeby.

Zdi

Úkol: Zkuste si vytvořit hru!


Další stránky

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje