Greenfoot

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Doplnění isKeyDown())
(Řešení situací: Změna obrázku přesunuta do teorie.)
Řádka 134: Řádka 134:
 
* 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í situací ==
+
== Řešení typických situací ==
 
=== Zdi ===
 
=== Zdi ===
=== Mizení Actorů ===
+
=== Rušení aktérů ===
K mizení slouží metoda:
+
World.removeObject(Actor kdoMaZmizet)
+
 
+
 
; Příklad 1) Zrušení kolidujících actorů
 
; Příklad 1) Zrušení kolidujících actorů
  private void sezerVsechnyKolidujici() {
+
  private void act() {
 +
    // ...
 
     World svet = this.getWorld();
 
     World svet = this.getWorld();
 
     List<Actor> seznam = this.getIntersectingObjects(null);  
 
     List<Actor> seznam = this.getIntersectingObjects(null);  
Řádka 149: Řádka 147:
 
     }
 
     }
  
; Příklad 2) Zrušení actoru, který vyjel mimo obrazovku na levém okraji
+
; Příklad 2) Zrušení aktéra, který vyjel mimo obrazovku na levém okraji
 
  public void act() {
 
  public void act() {
 
     // ...
 
     // ...
Řádka 157: Řádka 155:
 
             this.getWorld().removeObject(this);
 
             this.getWorld().removeObject(this);
 
         }
 
         }
    }
 
}
 
 
=== Změna obrázku Actoru ===
 
 
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 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 216: Řádka 192:
 
Na plochu počítadlo přidáme:
 
Na plochu počítadlo přidáme:
  
  public MujSvet() {
+
  public HraWorld() {
 
     ...
 
     ...
 
     this.addObject(Pocitadlo.getInstance(), 20, 20);
 
     this.addObject(Pocitadlo.getInstance(), 20, 20);
Řádka 233: Řádka 209:
  
 
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.
 
  
 
== Úkol: Zkuste si vytvořit hru! ==
 
== Úkol: Zkuste si vytvořit hru! ==

Verze z 20. 10. 2015, 07:09


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í Actorů

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);
   }


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í

Zdi

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.

Úkol: Zkuste si vytvořit hru!


Další stránky

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