Greenfoot
Z MiS
(Rozdíly mezi verzemi)
(→Zjištění kolize prvků ve hře: Doplněn obsah) |
(Rozepsáno podrobněji pozicování) |
||
Řádka 19: | Řádka 19: | ||
== Pohyb Actora == | == Pohyb Actora == | ||
Máme dvě varianty ovládání prvku (actora): | Máme dvě varianty ovládání prvku (actora): | ||
− | *turn() | + | ; Relativní pozicování |
− | * | + | * <code>turn(int oKolik)</code> ... otáčí o daný počet stupňů ve směru hodinových ručiček |
− | * | + | * <code>move(int delka)</code> ... pokročí vpřed o daný počet dílků ve směru, do kterého je otočen |
− | ** | + | * <code>setRotation(int uhel)</code> ... natočí prvek do daného směru (0 je směr vpravo, po směru hodinových ručiček) |
− | ** | + | * <code>turnTowards(int x, int y)</code> ... natočí prvek směrem k zadaným souřadnicím. |
− | + | ; Absolutní pozicování | |
+ | * <code>setLocation(int x, int y)</code> | ||
+ | ** přesune prvek na zadané souřadnice | ||
+ | ** obvykle je třeba uložit si souřadnice. | ||
+ | ; Příklad: vytvoření metody <code>move(int dx, int dy)</code> | ||
+ | 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 == | == Reakce na klávesy == | ||
Řádka 31: | Řádka 46: | ||
*Příklad viz dále. | *Příklad viz dále. | ||
− | + | ; Příklad: Pohyb podle kláves | |
String vstup = Greenfoot.getKey(); | String vstup = Greenfoot.getKey(); | ||
if (vstup != null) { | if (vstup != null) { |
Verze z 16. 12. 2013, 08:24
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
- Greenfoot.getKey()
- vrací null když nebyla stisknuta žádná
- Příklad viz dále.
- 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
null
když 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:
MouseWorld.removeObject(Actor kdoMaZmizet)
Příklad:
private void sezerVsechnyKolidujici() { World svet = this.getWorld(); List<Actor> seznam = this.getIntersectingObjects(null); for (Actor prvek : seznam) { prvek.aplikuj(this); svet.removeObject(prvek); }
- Změna obrázku Actoru
- Výpis stavu hry, hlášky
Úkol: Vytvořte hru!
- Vytvořte hru, na které ukážete ty prvky práce v Greenfootu, které jsme si ukázali výše.