Greenfoot: Řešení častých úloh

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Výpis stavu hry, hlášky: GreenfootColor má konstanty velkými písmeny)
(Počítadlo bodů, výpis stavu hry: Doplnění zjištění stavu počítadla.)
(Není zobrazeno 5 mezilehlých verzí od 1 uživatele.)
Řádka 41: Řádka 41:
  
  
== Výpis stavu hry, hlášky ==
+
== Hlášení ve hře ==
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)]].
+
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é vzory#Jedináček|návrhový vzor Jedináček (Singleton)]].
  
 
  public class Pocitadlo extends Actor
 
  public class Pocitadlo extends Actor
Řádka 49: Řádka 71:
 
     private static Pocitadlo prvniHrac = null;
 
     private static Pocitadlo prvniHrac = null;
 
     public static Pocitadlo getInstance() {
 
     public static Pocitadlo getInstance() {
         if (this.prvniHrac == null)  
+
         if (Pocitadlo.prvniHrac == null) {
             this.prvniHrac = new Pocitadlo();
+
             Pocitadlo.prvniHrac = new Pocitadlo();
 
         }
 
         }
         return this.prvniHrac;
+
         return Pocitadlo.prvniHrac;
 
     }
 
     }
 
      
 
      
Řádka 59: Řádka 81:
 
      
 
      
 
     '''private''' Pocitadlo() { // private kvůli Jedináčkovi
 
     '''private''' Pocitadlo() { // private kvůli Jedináčkovi
         this.setStav(0);
+
         this.reset();
 +
    }
 +
    public int getStav() {
 +
        return this.stav;
 
     }
 
     }
 
     public void setStav(int stav) {
 
     public void setStav(int stav) {
Řádka 69: Řádka 94:
 
     public void zmenStav(int zmena) {
 
     public void zmenStav(int zmena) {
 
         this.setStav(this.stav+zmena);
 
         this.setStav(this.stav+zmena);
 +
    }
 +
    public void reset() {
 +
        this.setStav(0);
 
     }
 
     }
 
  }
 
  }
  
Na plochu počítadlo přidáme:
+
; Přidání počitadla na plochu
 +
* Přidání počitadla na plochu provedeme v&nbsp;konstruktoru světa (třída <code>MyWorld</code> či jiná podle toho, jak si ji pojmenujeme).
  
  public HraWorld() {
+
  public MyWorld() {
    ...
+
    this.addObject(Pocitadlo.getInstance(), 20, 20);
+
 
     ...
 
     ...
 +
    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);
 
  }
 
  }
  
Změnu skóre pak kdekoli v projektu můžeme vyvolat:
+
; 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);
+
  Pocitadlo.getInstance().setStav(10); ''// Nastaví nový stav na 10 bodů - bez ohledu na předchozí stav.''
 
  ...
 
  ...
 
nebo
 
nebo
 
  ...
 
  ...
  Pocitadlo.getInstance().zmenStav(-2);
+
  Pocitadlo.getInstance().zmenStav(-2); ''// Sníží stav počítadla o&nbsp;2&nbsp;body oproti předchozímu stavu.
 
  ...
 
  ...
 
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 ==
 
== Zdi ==

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

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

Zdi

Související stránky

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