Greenfoot

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Přidána kategorie Greenfoot a odkaz na stránku Spouštění appletů.)
(Doplnění isKeyDown())
Řádka 1: Řádka 1:
 
[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:Greenfoot]]
 
[[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:Greenfoot]]
 +
  
 
== Co je to Greenfoot? ==
 
== Co je to Greenfoot? ==
Řádka 5: Řádka 6:
 
* [http://www.greenfoot.org/files/javadoc/ Greenfoot.org → Javadoc]
 
* [http://www.greenfoot.org/files/javadoc/ Greenfoot.org → Javadoc]
  
== Svět a volání metod act() ==
+
 
 +
== Princip ==
 +
* 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, kteří 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.
 +
 
 +
 
 +
== Nastavení parametrů světa ==
 
; Nastavení pozadí hrací plochy
 
; Nastavení pozadí hrací plochy
 
* Například v konstruktoru našeho potomka třídy World můžeme zavolat:
 
* Například v konstruktoru našeho potomka třídy World můžeme zavolat:
 
  World.setBackground(GreenfootImage obrazek)
 
  World.setBackground(GreenfootImage obrazek)
 +
  
 
== Vytváření Actorů ==
 
== Vytváření Actorů ==
Řádka 22: Řádka 37:
 
* Metoda <code>World.removeObject(Actor actor)</code>.
 
* Metoda <code>World.removeObject(Actor actor)</code>.
  
== 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 45: Řádka 61:
 
         this.setLocation(cilX, cilY);
 
         this.setLocation(cilX, cilY);
 
     }
 
     }
 +
  
 
== 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 68: Řádka 91:
 
     this.move(1);
 
     this.move(1);
 
  }
 
  }
 +
 +
=== 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é.
 +
  
 
== Náhodná čísla ==
 
== Náhodná čísla ==
Řádka 204: Řádka 233:
  
 
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.
 
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.
 +
  
 
== Úkol: Zkuste si vytvořit hru! ==
 
== Úkol: Zkuste si vytvořit hru! ==
Řádka 211: Řádka 241:
 
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].
 
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].
 
</div>
 
</div>
 +
  
 
== Další stránky ==
 
== Další stránky ==
 
* Máte-li probém se spouštěním aplikací na webu Greenfoot.org, zkuste: [[Spouštění appletů]].
 
* Máte-li probém se spouštěním aplikací na webu Greenfoot.org, zkuste: [[Spouštění appletů]].

Verze z 16. 10. 2015, 06:17


Obsah

Co je to Greenfoot?

Dokumentaci tříd najdete na adrese:


Princip

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.


Nastavení parametrů světa

Nastavení pozadí hrací plochy
World.setBackground(GreenfootImage obrazek)


Vytváření Actorů

Příprava instance actora
Umístění instance na plochu
Odstranění actora z plochy


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


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)


Náhodná čísla

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

Zjištění kolize prvků ve hře

Výběr třídy
List<Actor> seznam = this.getIntersectingObjects(null); 
List<Zradlo> seznam = this.getIntersectingObjects(Zradlo.class);
Návratová hodnota
getOneIntersectingObject(class)
getOneObjectAtOffset(int dx, int dy, class)
private void vyresKolidujici() {
   List<Actor> seznam = this.getIntersectingObjects(null); 
   for (Actor prvek : seznam) {
      prvek.aplikuj(this);
   }
}
Filtr

Ř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). 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 (this.prvniHrac == null) 
            this.prvniHrac = new Pocitadlo();
        }
        return this.prvniHrac;
    }
    
    // A zbytek kódu:
    private int stav;
    
    private Pocitadlo() { // private kvůli Jedináčkovi
        this.setStav(0);
    }
    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);
    }
}

Na plochu počítadlo přidáme:

public MujSvet() {
    ...
    this.addObject(Pocitadlo.getInstance(), 20, 20);
    ...
}

Změnu skóre pak kdekoli v projektu můžeme vyvolat:

...
Pocitadlo.getInstance().setStav(10);
...

nebo

...
Pocitadlo.getInstance().zmenStav(-2);
...

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.


Úkol: Zkuste si vytvořit hru!


Další stránky

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