Greenfoot: Řešení častých úloh
Z MiS
(Rozdíly mezi verzemi)
(Přidáno řešení aktéra, který chvilku zůstane na obrazovce a pak zmizí...) |
(→Počítadlo bodů, výpis stavu hry: Doplnění zjištění stavu počítadla.) |
||
(Není zobrazeno 6 mezilehlých verzí od 1 uživatele.) | |||
Řádka 41: | Řádka 41: | ||
− | == | + | == 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é 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 ( | + | if (Pocitadlo.prvniHrac == null) { |
− | + | Pocitadlo.prvniHrac = new Pocitadlo(); | |
} | } | ||
− | return | + | return Pocitadlo.prvniHrac; |
} | } | ||
Řádka 59: | Řá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) { | ||
this.stav = stav; | this.stav = stav; | ||
String text = "Skóre: "+this.stav; | String text = "Skóre: "+this.stav; | ||
− | GreenfootImage obrazek = new GreenfootImage(text, 20, Color. | + | GreenfootImage obrazek = new GreenfootImage(text, 20, Color.YELLOW, Color.GRAY); |
this.setImage(obrazek); | this.setImage(obrazek); | ||
} | } | ||
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); | ||
} | } | ||
} | } | ||
− | + | ; 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); | ||
+ | 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); | + | 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 2 body oproti předchozímu stavu. |
... | ... | ||
− | |||
− | |||
− | |||
== 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
- 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. ...