Greenfoot
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				|  (→Mizení Actorů:  Oprava MouseWorld -> World + dodán příklad, kam umístit test na zmizení actoru) |  (→Výpis stavu hry, hlášky:  Přidán kód počítadla) | ||
| Řádka 149: | Řádka 149: | ||
| === 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): | ||
| + | |||
| + |  public class Pocitadlo extends Actor | ||
| + |  { | ||
| + |      public Pocitadlo() { | ||
| + |          this.zmenStav(0); | ||
| + |      } | ||
| + |      public void zmenStav(int stav) { | ||
| + |          String text = "Skóre: "+stav; | ||
| + |          GreenfootImage vzhled = new GreenfootImage(text, 20, Color.yellow, Color.gray); | ||
| + |          this.setImage(vzhled); | ||
| + |      } | ||
| + |  } | ||
| + | |||
| + | Toho potom předáme všem třídám, které mají měnit skóre. Případně je možné implementovat návrhový vzor Jedináček, neboť skóre je ve hře nejspíš jen jedno. | ||
| == Úkol: Vytvořte hru! == | == Úkol: Vytvořte hru! == | ||
| * Vytvořte hru, na které ukážete ty prvky práce v Greenfootu, které jsme si ukázali výše. | * Vytvořte hru, na které ukážete ty prvky práce v Greenfootu, které jsme si ukázali výše. | ||
Verze z 27. 1. 2014, 08:58
| Obsah | 
Co je to Greenfoot?
Dokumentaci tříd najdete na adrese:
Svět a volání metod act()
- Nastavení pozadí hrací plochy
- Například v konstruktoru našeho potomka třídy World můžeme zavolat:
World.setBackground(GreenfootImage obrazek)
Vytvoření a přidání Actorů
- Prvky jsou potomky třídy Actor.
- Instance vytváříme klasicky (new).
- Umístění na plochu:
- World.addObject(Actor actor, int x, int y)
- umístí na pozici (x, y)
 
Pohyb Actora
Máme dvě varianty ovládání prvku (actora):
- Relativní pozicování
-  turn(int oKolik)... otáčí o daný počet stupňů ve směru hodinových ručiček
-  move(int delka)... pokročí vpřed o daný počet dílků ve směru, do kterého je otočen
-  setRotation(int uhel)... natočí prvek do daného směru (0 je směr vpravo, po směru hodinových ručiček)
-  turnTowards(int x, int y)... natočí prvek směrem k zadaným souřadnicím.
- Absolutní pozicování
-  setLocation(int x, int y)- přesune prvek na zadané souřadnice
- obvykle je třeba uložit si souřadnice.
 
- 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
String Greenfoot.getKey()
-  vrací null, když nebyla stisknuta žádná klávesa.
-  Speciální klávesy:
-  "space"... mezerník
-  "up","down","right","left"... šipky
-  "F1",... funkční klávesy
 
-  
- 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);
}
Náhodná čísla
- Standardní řešení Javy
-  Math.random()... vrací čísla z intervalu <0, 1)
- Řešení Greenfootu
- Pro hry je často potřeba generovat celá čísla. Pro zjednodušení je tedy v Greenfootu metoda:
-  Greenfoot.getRandomNumber(int limit)- Vrací čísla z množiny {0, 1, ..., limit-1}.
 
Zjištění kolize prvků ve hře
-  Ke zjištění kolizí slouží metody ve třídě Actor, které se jmenují get...Object....
- Metod je hodně, ale chovají se podobně.
- Výběr třídy
-  Pokud zadáte parametr typu class, bere v potaz pouze objekty zadaného typu. Pokud zadáme null, berou se v potaz všechny objekty.
- Všechny objekty:
List<Actor> seznam = this.getIntersectingObjects(null);
- Jen objekty zvoleného typu:
List<Zradlo> seznam = this.getIntersectingObjects(Zradlo.class);
- Návratová hodnota
-  Vrací buď první kolidující objekt nebo nullkdyž nekoliduje:
getOneIntersectingObject(class) getOneObjectAtOffset(int dx, int dy, class)
- ... nebo seznam všech vyhovujících objektů.
private void vyresKolidujici() {
   List<Actor> seznam = this.getIntersectingObjects(null); 
   for (Actor prvek : seznam) {
      prvek.aplikuj(this);
   }
}
- Filtr
- 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
Řešení situací
Zdi
Mizení Actorů
K mizení slouží metoda:
World.removeObject(Actor kdoMaZmizet)
- Příklad 1) Zrušení kolidujících actorů
private void sezerVsechnyKolidujici() {
   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í actoru, 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);
        }
    }
}
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 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);
        }
        // ...
    }
}
Výpis stavu hry, hlášky
Pro výpis skóre vytváříme nového speciálního „actora“ (objekt):
public class Pocitadlo extends Actor
{
    public Pocitadlo() {
        this.zmenStav(0);
    }
    public void zmenStav(int stav) {
        String text = "Skóre: "+stav;
        GreenfootImage vzhled = new GreenfootImage(text, 20, Color.yellow, Color.gray);
        this.setImage(vzhled);
    }
}
Toho potom předáme všem třídám, které mají měnit skóre. Případně je možné implementovat návrhový vzor Jedináček, neboť skóre je ve hře nejspíš jen jedno.
Úkol: Vytvořte hru!
- Vytvořte hru, na které ukážete ty prvky práce v Greenfootu, které jsme si ukázali výše.
