Greenfoot

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Výpis stavu hry, hlášky: Přidán kód počítadla)
(Přidání ukázky: Game over! s textovým aktérem.)
 
(Není zobrazeno 21 mezilehlých verzí od 1 uživatele.)
Řádka 1: Řádka 1:
[[Category:VSE]][[Category:Informatika]][[Category:Programování]]
+
[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:Greenfoot]]
 +
 
  
 
== Co je to Greenfoot? ==
 
== Co je to Greenfoot? ==
Dokumentaci tříd najdete na adrese:
 
* [http://www.greenfoot.org/files/javadoc/ Greenfoot.org → Javadoc]
 
  
== Svět a volání metod act() ==
+
Greenfoot je framework pro tvorbu jednoduchých 2D her, postavený na programovacích jazycích Java a Stride (my zde využíváme jazyk Java).
; Nastavení pozadí hrací plochy
+
 
* Například v konstruktoru našeho potomka třídy World můžeme zavolat:
+
; Princip funkce
World.setBackground(GreenfootImage obrazek)
+
* Vzhled hry popisuje třída, která musí být potomkem třídy <code>World</code>. Předpokládejme, že se bude jmenovat <code>HraWorld</code>, ale název si můžeme vymyslet.
 +
* Na hrací ploše jsou aktéři (''actor'').
 +
* Chování aktérů je popsáno třídami, které jsou potomky třídy <code>Actor</code>.
 +
* Aktéři jsou vizuálně zastoupeni obrázkem, který vybíráme při vytvoření třídy aktéra.
 +
; Průběh hry:
 +
# Vytvoří se instance třídy <code>HraWorld</code> (resp. jak jsme nazvali svého potomka třídy <code>World</code>).
 +
# Spustí se konstruktor třídy <code>HraWorld</code>.
 +
# A dále se opakuje:
 +
## Zavolá se metoda <code>act()</code> na svět (potomka třídy <code>HraWorld</code>).
 +
## Zavolá se metoda <code>act()</code> pro všechny aktéry.
 +
 
 +
 
 +
 
 +
== Vytváření aktérů ==
 +
; Příprava instance aktéra
 +
* Prvky ve hře (postavy atd.) jsou třídy, které jsou potomky třídy <code>Actor</code>.
 +
* Jejich instance vytváříme stejně jako vždy v Javě: operátorem <code>new</code>.
 +
 
 +
;Umístění instance aktéra na plochu:
 +
* Metoda <code>World.addObject(Actor actor, int x, int y)</code>.
 +
* Umístí aktéra na pozici (x, y)
 +
 
 +
; Odstranění aktéra z plochy
 +
* Metoda <code>World.removeObject(Actor actor)</code>.
 +
 
 +
<div class="Priklad">
 +
Příklad — Vytvoření aktéra třídy <code>Panacek</code> a umístění na souřadnice (200, 150).
 +
  public class MojeHra extends World {
 +
  ...
 +
  public void MojeHra() {
 +
    ...
 +
    Panacek panacek = new Panacek();
 +
    this.addObject(panacek, 200, 150);
 +
    ...
 +
  }
 +
</div>
 +
 
  
== 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 ==
+
== Nastavení pozice aktéra ==
 
Máme dvě varianty ovládání prvku (actora):
 
Máme dvě varianty ovládání prvku (actora):
 
; Relativní pozicování
 
; Relativní pozicování
Řádka 40: Řádka 69:
 
         this.setLocation(cilX, cilY);
 
         this.setLocation(cilX, cilY);
 
     }
 
     }
 +
 +
 +
== Změna obrázku aktéra ==
 +
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 <tt>images</tt> složky s&nbsp;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);
 +
        }
 +
        // ...
 +
    }
 +
}
 +
 +
 +
 +
=== Aktér s textovým popisem ===
 +
Pokud chceme místo obrázku aktéra zobrazit text, využijeme alternativní konstruktor třídy <code>GreenfootImage</code>:
 +
    GreenfootImage imgVlevo = new GreenfootImage("Vlevo!", 50, Color.RED, Color.YELLOW);
 +
Zbytek kódu zůstává stejný. Jen potřebujeme navíc do hlavičky (úplně na začátek kódu třídy aktéra) doplnit k&nbsp;importu tříd knihovny <code>Greenfoot</code> i import třídy <code>java.awt.Color</code>:
 +
    import Greenfoot.*;
 +
    '''import java.awt.Color;'''
 +
    ...
 +
 +
<div class="Priklad">
 +
; Příklad &mdash; „Game over!“
 +
* Připravme si hlášení „Game over!“, které zobrazíme na konci hry.
 +
 +
Třída GameOver:
 +
 +
import Greenfoot.*;
 +
import java.awt.Color;
 +
 +
/** Třída GameOver bude reprezentovat aktéra, který bude fungovat jako
 +
  * textové hlášení.
 +
  */
 +
public class GameOver {
 +
    public GameOver() {
 +
        GreenfootImage imgGameOver = new GreenfootImage("Vlevo!", 50, Color.YELLOW, Color.BLUE);
 +
        this.setImage(imgGameOver);
 +
    }
 +
}
 +
 +
 +
Ukončení hry:
 +
 +
import Greenfoot.*;
 +
 +
/** Třída Panáček - po srážce s&nbsp;kamenem ukončí hru. */
 +
public class Panacek {
 +
    public void act() {
 +
        if (this.isTouching(Kamen.class)) {
 +
            World svet = this.getWorld();
 +
            ''// Přidej hlášení "Game over!"''
 +
            svet.addObject('''new GameOver()''', svet.getWidth()/2, svet.getHeight/2);
 +
            ''// Ukonči hru:''
 +
            '''Greenfoot.stop();'''
 +
        }
 +
    }
 +
}
 +
 +
Samozřejmě panáček toho může dělat víc a&nbsp;třídy se můžou jmenovat jinak.
 +
</div>
 +
 +
  
 
== Reakce na klávesy ==
 
== Reakce na klávesy ==
 +
=== Stisk klávesy (napsání písmenka) ===
 
<code>String Greenfoot.getKey()</code>
 
<code>String Greenfoot.getKey()</code>
* vrací <code>null</code>, když nebyla stisknuta žádná klávesa.
+
* Vrací <code>null</code>, když nebyla stisknuta žádná klávesa.
 +
* Odpovídá tomu, jak píše písmenka textový editor.
 +
* Pokud uživatel drží stisknutou klávesu déle, pak:
 +
*# Pošle se jedno písmeno,
 +
*# nějakou dobu se počká a neposílá se nic,
 +
*# pak se začne opakovaně vysílat písmeno, dokud uživatel klávesu nepustí, nebo
 
* Speciální klávesy:
 
* Speciální klávesy:
 
** <code>"space"</code> ... mezerník
 
** <code>"space"</code> ... mezerník
Řádka 64: Řádka 173:
 
  }
 
  }
  
== Náhodná čísla ==
+
=== Detekce, zda uživatel drží klávesu ===
 +
<code>boolean Greenfoot.isKeyDown(String klavesa)</code>
 +
* Pokud uživatel drží klávesu delší dobu, zůstane platná pořád.
 +
* Takto lze detekovat stisk více kláves zároveň, nemusí to však být tak spolehlivé.
 +
 
 +
=== Funkční klávesy ===
 +
* Tímto způsobem můžeme detekovat i&nbsp;stisk funkčních kláves ''Control'' a ''Shift''.
 +
* Kódy pro tyto klávesy jsou <code>"control"</code> a <code>"shift"</code>.
 +
* Pokud tedy chceme detekovat kombinaci <code>&lt;Ctrl&gt;+&lt;Shift&gt;+&lt;S&gt;</code>, pak píšeme:
 +
String pismeno = Greenfoot.getKey();
 +
if (Greenfoot.isKeyDown("control") && Greenfoot.isKeyDown("shift") && "s".equals(pismeno)) {
 +
    ''... co se má stát ... ''
 +
}
 +
 
 +
=== Jak detekovat pouze písmena a čísla? ===
 +
* Občas bychom chtěli reagovat pouze na alfanumerické znaky (písmena a čísla).
 +
* K tomu můžete použít jednoduchý trik &mdash; většina funkčních kláves má totiž kódy z&nbsp;více písmen. Můžeme tedy využít toho, že když je funkční kód klávesy jen jedno písmeno, považujeme ho za alfanumerický znak:
 +
String pismeno = Greenfoot.getKey();
 +
if (pismeno.lenght() == 1) {
 +
    ''... co se má stát ... ''
 +
}
 +
 
 +
== Zjištění pozice myši ==
 +
<code>MouseInfo Greenfoot.getMouseInfo()</code>
 +
* Vrací instanci třídy <code>MouseInfo</code>.
 +
* <code>MouseInfo</code> nese informace o:
 +
** Pozici X a Y kurzoru: <code>int MouseInfo.getX()</code>, <code>int MouseInfo.getY()</code>
 +
** Stisku tlačítek,...
 +
 
 +
; Příklad: Pohyb aktéra za myší
 +
public void act() {
 +
    MouseInfo mi = Greenfoot.getMouseInfo();
 +
    int x = mi.getX();
 +
    int y = mi.getY();
 +
    int vzdalenost = (int) Math.sqrt(Math.pow(x-this.getX(),2)+Math.pow(y-this.getY(),2));
 +
   
 +
    if (vzdalenost > 0) {
 +
        this.turnTowards(x, y);
 +
        this.move(Math.min(vzdalenost, 5));
 +
        this.setRotation(0);
 +
    }
 +
}
 +
 
 +
 
 +
 
 +
== Další tipy ==
 +
 
 +
=== Náhodná čísla ===
 
; Standardní řešení Javy:
 
; Standardní řešení Javy:
 
* <code>Math.random()</code> ... vrací čísla z intervalu &lt;0, 1)
 
* <code>Math.random()</code> ... vrací čísla z intervalu &lt;0, 1)
Řádka 72: Řádka 228:
 
** Vrací čísla z množiny {0, 1, ..., limit-1}.
 
** Vrací čísla z množiny {0, 1, ..., limit-1}.
  
== Zjištění kolize prvků ve hře ==
+
=== Okraj obrazovky ===
 +
* Pro detekci, zda je aktér na okraji obrazovky, můžeme použít metodu <code>isAtEdge()</code>.
 +
if (this.isAtEdge()) {
 +
    this.turn(180);
 +
}
  
* Ke zjištění kolizí slouží metody ve třídě <tt>Actor</tt>, které se jmenují <code>get...Object...</code>.
+
=== Objekty mimo obrazovku ===
* Metod je hodně, ale chovají se podobně.
+
* Pokud v konstruktoru světa (třída <code>World</code>) použijete volitelný parametr, můžete povolit umístění objektů mimo obrazovku.
 +
public class MyWorld extends World
 +
{
 +
    public MyWorld()
 +
    {
 +
        super(600, 400, 1, '''false''');
 +
    }
 +
}
  
; Výběr třídy
+
== Zjištění kolize aktérů ve hře ==
* Pokud zadáte parametr typu <tt>class</tt>, bere v potaz pouze objekty zadaného typu. Pokud zadáme <code>null</code>, berou se v potaz všechny objekty.
+
* Ke zjištění kolizí slouží metody ve třídě <tt>Actor</tt>, které se jmenují <code>get''XXX''Object''YYY''</code>.
* Všechny objekty:
+
* Metod je hodně, ale chovají se podobně:
 +
'''get'''OneIntersecting'''Object'''(class)
 +
* Vrátí jeden kolidující objekt.
 +
* Řeší kolizi jen objektů té třídy, kterou zadáme jako parametr.
 +
* Pokud chceme, aby řešil kolize s&nbsp;objekty libovolné třídy, zadáme jako parametr <code>null</code>.
 +
'''get'''Intersecting'''Object'''s(class)
 +
* Vrátí seznam všech objektů, kolidujících s aktérem.
 +
'''get'''One'''Object'''AtOffset(int dx, int dy, class)
 +
* Vrátí jednoho aktéra z&nbsp;aktérů vzdálených nejvýše (dx, dy)(viz dále).
 +
...
 +
 
 +
; Výběr třídy objektů
 +
* Pokud zadáte parametr typu <tt>class</tt>, bere v potaz pouze objekty zadaného typu. Pokud zadáme <code>null</code>, berou se v&nbsp;potaz všechny objekty.
 +
 
 +
Příklad:
 
  List<Actor> seznam = this.getIntersectingObjects(null);  
 
  List<Actor> seznam = this.getIntersectingObjects(null);  
* Jen objekty zvoleného typu:
+
* Bere v potaz všechny typy aktérů. Může se jednat o aktéry různých typů (instance různých tříd).
  List<Zradlo> seznam = this.getIntersectingObjects(Zradlo.class);
+
  List<Jablko> seznam = this.getIntersectingObjects(Jablko.class);
 +
* Detekuje pouze kolidující aktéry třídy <code>Jablko</code>, všechny ostatní objekty ignoruje!
  
 
; Návratová hodnota
 
; Návratová hodnota
* Vrací buď první kolidující objekt nebo <code>null</code> když nekoliduje:
+
Tyto metody vrací buď:
  getOneIntersectingObject(class)
+
* první kolidující objekt daného typu nebo <code>null</code> když nekoliduje žádný objekt daného typu:
getOneObjectAtOffset(int dx, int dy, class)
+
  private void vyresKolidujici() {
* ... nebo seznam všech vyhovujících objektů.
+
    Predmet predmet = (Predmet) this.getOneIntersectingObject(Predmet.class);
 +
    if (predmet != null) {
 +
      ''... Co se má dít, třeba: ...''
 +
      this.getWorld().removeObject(predmet);
 +
    }
 +
}
 +
* nebo seznam (může být prázdný) všech kolidujících objektů daného typu:
 
  private void vyresKolidujici() {
 
  private void vyresKolidujici() {
 
     List<Actor> seznam = this.getIntersectingObjects(null);  
 
     List<Actor> seznam = this.getIntersectingObjects(null);  
Řádka 95: Řádka 283:
 
     }
 
     }
 
  }
 
  }
 +
 +
<div class="Poznamka">
 +
Pokud vrací metoda seznam kolidujících objektů, pak musíme importovat třídu <code>java.util.List</code> tím, že napíšeme úplně na začátek:
 +
 +
import java.util.List;
 +
</div>
  
 
; Filtr
 
; Filtr
Řádka 100: Řádka 294:
 
* objects at offset ... objekty, které jsou v dané vzdálenosti (dx, dy) od stávajícího objektu
 
* objects at offset ... objekty, které jsou v dané vzdálenosti (dx, dy) od stávajícího objektu
  
== Řešení situací ==
+
== Práce s&nbsp;prostředím hry (World) ==
=== Zdi ===
+
=== Mizení Actorů ===
+
K mizení slouží metoda:
+
World.removeObject(Actor kdoMaZmizet)
+
  
; Příklad 1) Zrušení kolidujících actorů
+
=== Nastavení pozadí hrací plochy ===
  private void sezerVsechnyKolidujici() {
+
* Obrázek na pozadí prostředí/světa změníme metodou:
    World svet = this.getWorld();
+
  World.setBackground(GreenfootImage obrazek)
    List<Actor> seznam = this.getIntersectingObjects(null);
+
* Tuto metodu můžeme zavolat například v&nbsp;konstruktoru našeho potomka třídy <code>World</code>.
    for (Actor prvek : seznam) {
+
      prvek.aplikuj(this);
+
      svet.removeObject(prvek);
+
    }
+
  
; Příklad 2) Zrušení actoru, který vyjel mimo obrazovku na levém okraji
+
=== Přepínání prostředí/světů v&nbsp;Greenfootu ===
  public void act() {
+
* Pokud potřebujete přepnout hru do jiného prostředí (světa), máte k&nbsp;dispozici metodu:
    // ...
+
  Greenfoot.setWorld(World ''novySvet'')
    if (this.getX() < 1) {
+
<div class="Priklad">
        World svet = this.getWorld();
+
Příklad:
        if (svet != null) {
+
1. krok: Upravte třídu MyWorld:
            this.getWorld().removeObject(this);
+
public class MyWorld extends World
        }
+
{
    }
+
int citac = 0;
 +
int konec = 300;
 +
public MyWorld()
 +
{
 +
super(600, 400, 1);
 +
}
 +
public void act() {
 +
System.out.println("Zbývá: "+(this.konec-this.citac));
 +
this.citac++;
 +
if (this.citac > this.konec)  
 +
{
 +
Greenfoot.setWorld(new DruhySvet());
 +
}
 +
}
 +
}
 +
2. krok: Vytvořte druhou instanci třídy World, které nastavte jako pozadí některý obrázek ze záložky Backgrounds:
 +
public class DruhySvet extends World
 +
{
 +
public MyWorld()
 +
{
 +
super(600, 400, 1);
 +
}  
 
  }
 
  }
 +
Po spuštění hry by hra měla chvíli čekat a pak by se mělo změnit pozadí &mdash; dojde ke změně prostředí hry (world).
 +
</div>
  
=== 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 <tt>images</tt> složky s projektem.
+
== Úkol: Zkuste si vytvořit hru! ==
 +
* Vytvořte hru, na které ukážete ty prvky práce v Greenfootu, které jsme si ukázali výše.
  
; Příklad 1) Otočení vlevo či vpravo
+
<div class="Priklad">
class Panacek extends Actor
+
Přikládám [https://www.facebook.com/events/558069520954069/?ref=22 pár nápadů pro inspiraci] z projektů řešených na [http://www.oauh.cz Obchodní akademii Uherské Hradiště - obor Informační technologie].
    GreenfootImage imgVlevo = new GreenfootImage("imgVlevo.png");
+
</div>
    // ...
+
    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):
+
== Související stránky ==
 +
* [[Greenfoot: Řešení častých úloh]]
 +
* Máte-li probém se spouštěním aplikací na webu Greenfoot.org, zkuste: [[Spouštění appletů]].
  
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! ==
+
== Zdroje ==
* Vytvořte hru, na které ukážete ty prvky práce v Greenfootu, které jsme si ukázali výše.
+
* Existují velmi rozsáhlá fóra (v&nbsp;angličtině), popisující řešení problémů v&nbsp;Greenfootu. Zkuste ve vyhledávači najít: <code>greenfoot ''téma-které-hledáte''</code>.
 +
* Dokumentaci tříd najdete na adrese [http://www.greenfoot.org/files/javadoc/ Greenfoot.org &rarr; Javadoc]

Aktuální verze z 18. 5. 2020, 09:08


Obsah

Co je to Greenfoot?

Greenfoot je framework pro tvorbu jednoduchých 2D her, postavený na programovacích jazycích Java a Stride (my zde využíváme jazyk Java).

Princip funkce
Průběh hry
  1. Vytvoří se instance třídy HraWorld (resp. jak jsme nazvali svého potomka třídy World).
  2. Spustí se konstruktor třídy HraWorld.
  3. A dále se opakuje:
    1. Zavolá se metoda act() na svět (potomka třídy HraWorld).
    2. Zavolá se metoda act() pro všechny aktéry.


Vytváření aktérů

Příprava instance aktéra
Umístění instance aktéra na plochu
Odstranění aktéra z plochy

Příklad — Vytvoření aktéra třídy Panacek a umístění na souřadnice (200, 150).

 public class MojeHra extends World {
 ...
 public void MojeHra() {
   ...
   Panacek panacek = new Panacek();
   this.addObject(panacek, 200, 150);
   ...
 }


Nastavení pozice aktéra

Máme dvě varianty ovládání prvku (actora):

Relativní pozicování
Absolutní pozicování
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);
   }


Změna obrázku aktéra

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);
        }
        // ...
    }
}


Aktér s textovým popisem

Pokud chceme místo obrázku aktéra zobrazit text, využijeme alternativní konstruktor třídy GreenfootImage:

    GreenfootImage imgVlevo = new GreenfootImage("Vlevo!", 50, Color.RED, Color.YELLOW);

Zbytek kódu zůstává stejný. Jen potřebujeme navíc do hlavičky (úplně na začátek kódu třídy aktéra) doplnit k importu tříd knihovny Greenfoot i import třídy java.awt.Color:

   import Greenfoot.*;
   import java.awt.Color;
   ...
Příklad — „Game over!“
  • Připravme si hlášení „Game over!“, které zobrazíme na konci hry.

Třída GameOver:

import Greenfoot.*;
import java.awt.Color;

/** Třída GameOver bude reprezentovat aktéra, který bude fungovat jako 
 * textové hlášení.
 */
public class GameOver {
    public GameOver() {
        GreenfootImage imgGameOver = new GreenfootImage("Vlevo!", 50, Color.YELLOW, Color.BLUE);
        this.setImage(imgGameOver);
    }
}

Ukončení hry:

import Greenfoot.*;

/** Třída Panáček - po srážce s kamenem ukončí hru. */
public class Panacek {
    public void act() {
        if (this.isTouching(Kamen.class)) {
            World svet = this.getWorld();
            // Přidej hlášení "Game over!"
            svet.addObject(new GameOver(), svet.getWidth()/2, svet.getHeight/2);
            // Ukonči hru:
            Greenfoot.stop();
        }
    }
}

Samozřejmě panáček toho může dělat víc a třídy se můžou jmenovat jinak.


Reakce na klávesy

Stisk klávesy (napsání písmenka)

String Greenfoot.getKey()

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);
}

Detekce, zda uživatel drží klávesu

boolean Greenfoot.isKeyDown(String klavesa)

Funkční klávesy

String pismeno = Greenfoot.getKey();
if (Greenfoot.isKeyDown("control") && Greenfoot.isKeyDown("shift") && "s".equals(pismeno)) {
   ... co se má stát ... 
}

Jak detekovat pouze písmena a čísla?

String pismeno = Greenfoot.getKey();
if (pismeno.lenght() == 1) {
   ... co se má stát ... 
}

Zjištění pozice myši

MouseInfo Greenfoot.getMouseInfo()
Příklad
Pohyb aktéra za myší
public void act() {
    MouseInfo mi = Greenfoot.getMouseInfo();
    int x = mi.getX();
    int y = mi.getY();
    int vzdalenost = (int) Math.sqrt(Math.pow(x-this.getX(),2)+Math.pow(y-this.getY(),2));
    
    if (vzdalenost > 0) {
        this.turnTowards(x, y);
        this.move(Math.min(vzdalenost, 5));
        this.setRotation(0);
    }
}


Další tipy

Náhodná čísla

Standardní řešení Javy
Řešení Greenfootu

Okraj obrazovky

if (this.isAtEdge()) {
    this.turn(180);
}

Objekty mimo obrazovku

public class MyWorld extends World
{
    public MyWorld()
    {
        super(600, 400, 1, false); 
    }
}

Zjištění kolize aktérů ve hře

getOneIntersectingObject(class)
getIntersectingObjects(class)
getOneObjectAtOffset(int dx, int dy, class)
...
Výběr třídy objektů

Příklad:

List<Actor> seznam = this.getIntersectingObjects(null); 
List<Jablko> seznam = this.getIntersectingObjects(Jablko.class);
Návratová hodnota

Tyto metody vrací buď:

private void vyresKolidujici() {
   Predmet predmet = (Predmet) this.getOneIntersectingObject(Predmet.class); 
   if (predmet != null) {
      ... Co se má dít, třeba: ...
      this.getWorld().removeObject(predmet);
   }
}
private void vyresKolidujici() {
   List<Actor> seznam = this.getIntersectingObjects(null); 
   for (Actor prvek : seznam) {
      prvek.aplikuj(this);
   }
}

Pokud vrací metoda seznam kolidujících objektů, pak musíme importovat třídu java.util.List tím, že napíšeme úplně na začátek:

import java.util.List;
Filtr

Práce s prostředím hry (World)

Nastavení pozadí hrací plochy

World.setBackground(GreenfootImage obrazek)

Přepínání prostředí/světů v Greenfootu

Greenfoot.setWorld(World novySvet)

Příklad: 1. krok: Upravte třídu MyWorld:

public class MyWorld extends World 
{
	int citac = 0;
	int konec = 300;
	public MyWorld()
	{
		super(600, 400, 1); 
	}
	public void act() {
		System.out.println("Zbývá: "+(this.konec-this.citac));
		this.citac++;
		if (this.citac > this.konec) 
		{
			Greenfoot.setWorld(new DruhySvet());
		}
	}
}

2. krok: Vytvořte druhou instanci třídy World, které nastavte jako pozadí některý obrázek ze záložky Backgrounds:

public class DruhySvet extends World 
{
	public MyWorld()
	{
		super(600, 400, 1); 
	} 
}

Po spuštění hry by hra měla chvíli čekat a pak by se mělo změnit pozadí — dojde ke změně prostředí hry (world).


Úkol: Zkuste si vytvořit hru!


Související stránky


Zdroje

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