Greenfoot: Řešení častých úloh
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				| m (→Počítadlo bodů, výpis stavu hry:  Oprava drobných chyb.) |  (→Počítadlo bodů, výpis stavu hry:  Doplnění zjištění stavu počítadla.) | ||
| Řádka 81: | Řádka 81: | ||
|       '''private''' Pocitadlo() { // private kvůli Jedináčkovi |       '''private''' Pocitadlo() { // private kvůli Jedináčkovi | ||
| − |           this. | + |           this.reset(); | 
| + |      } | ||
| + |      public int getStav() { | ||
| + |          return this.stav; | ||
|       } |       } | ||
|       public void setStav(int stav) { |       public void setStav(int stav) { | ||
| Řádka 97: | Řádka 100: | ||
|   } |   } | ||
| − | + | ; Přidání počitadla na plochu | |
| + | * Přidání počitadla na plochu provedeme v konstruktoru světa (třída <code>MyWorld</code> či jiná podle toho, jak si ji pojmenujeme). | ||
| − |   public  | + |   public MyWorld() { | 
|       ... |       ... | ||
| − | |||
|       this.addObject(Pocitadlo.getInstance(), 50, 30); |       this.addObject(Pocitadlo.getInstance(), 50, 30); | ||
| − |       ... | + |       Pocitadlo.getInstance().reset(); ''// Vynulování počítadla'' | 
| + |      ''// Pokud se na stejném místě jako počítadlo objeví jiný objekt, bude vždy pod počitadlem:'' | ||
| + |      this.setPaintOrder(Pocitadlo.class);  | ||
|   } |   } | ||
| − | + | ; Zjištění aktuálního skóre | |
| − | + | * Ve kterékoli třídě pak můžeme vyvolat zjištění skóre: | |
| − | + |   ... | |
| − | + |  int skore = Pocitadlo.getInstance().getStav(); | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | Změnu skóre  | + | ; Změnu skóre provedeme: | 
|   ... |   ... | ||
|   Pocitadlo.getInstance().setStav(10); ''// Nastaví nový stav na 10 bodů - bez ohledu na předchozí stav.'' |   Pocitadlo.getInstance().setStav(10); ''// Nastaví nový stav na 10 bodů - bez ohledu na předchozí stav.'' | ||
Verze z 25. 3. 2020, 11:51
| Obsah | 
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);
        }
    }
}
Aktér se objeví a zmizí
Pokud chceme aktéra, který se objeví na nějakou dobu a pak zmizí, stačí si v atributu počítá, kolikrát byla zavolána metoda act():
int jakDlouhoZiji = 0;
public void act() 
{
    this.jakDlouhoZiji++;
    if (this.jakDlouhoZiji >= 200) {
        World svet = this.getWorld();
        int x = Greenfoot.getRandomNumber(svet.getWidth());
        int y = Greenfoot.getRandomNumber(svet.getHeight());
        this.setLocation(x, y);
        this.jakDlouhoZiji = 0;
    }
}
Hlášení ve hře
Někdy potřebujeme hráče upozornit na nějakou událost ve hře vyskakovacím hlášením. V Greenfootu je to nejjednodušší tak, že vyrobíte aktéra, který bude mít místo obrázku text. Tohoto aktéra potom přidáte do světa.
Třída aktéra:
public class Hlaseni
{
    public Hlaseni()
    {
        GreenfootImage banner = new GreenfootImage("Text", 30, Color.YELLOW, Color.RED);
        this.setImage(banner);  
    }
}
Umístění aktéra do světa:
... this.setPaintOrder(Hlaseni.class); // Zařídí, že se hlášení objeví nahoře nad všemi ostatními aktéry. this.getWorld().addObject(new Hlaseni(), 300, 200); ...
Počítadlo bodů, výpis stavu hry
- Podobně jako vyskakovací hlášení můžeme realizovat i zobrazení počítadla bodů. I tady vytváříme nového speciálního „actora“ (aktéra hry).
- 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 (Pocitadlo.prvniHrac == null) {
            Pocitadlo.prvniHrac = new Pocitadlo();
        }
        return Pocitadlo.prvniHrac;
    }
    
    // A zbytek kódu:
    private int stav;
    
    private Pocitadlo() { // private kvůli Jedináčkovi
        this.reset();
    }
    public int getStav() {
        return this.stav;
    }
    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);
    }
    public void reset() {
        this.setStav(0);
    }
}
- Přidání počitadla na plochu
-  Přidání počitadla na plochu provedeme v konstruktoru světa (třída MyWorldči jiná podle toho, jak si ji pojmenujeme).
public MyWorld() {
    ...
    this.addObject(Pocitadlo.getInstance(), 50, 30);
    Pocitadlo.getInstance().reset(); // Vynulování počítadla
    // Pokud se na stejném místě jako počítadlo objeví jiný objekt, bude vždy pod počitadlem:
    this.setPaintOrder(Pocitadlo.class); 
}
- Zjištění aktuálního skóre
- Ve kterékoli třídě pak můžeme vyvolat zjištění skóre:
... int skore = Pocitadlo.getInstance().getStav();
- Změnu skóre provedeme
... Pocitadlo.getInstance().setStav(10); // Nastaví nový stav na 10 bodů - bez ohledu na předchozí stav. ...
nebo
... Pocitadlo.getInstance().zmenStav(-2); // Sníží stav počítadla o 2 body oproti předchozímu stavu. ...
