Greenfoot

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Zjištění kolize prvků ve hře)
(Přidán pohyb za myší a snímání vlastností myši, osamostatněna řešení častých úloh.)
Řádka 119: Řádka 119:
 
* Pokud uživatel drží klávesu delší dobu, zůstane platná pořád.
 
* 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é.
 
* Takto lze detekovat stisk více kláves zároveň, nemusí to však být tak spolehlivé.
 +
 +
 +
== 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);
 +
    }
 +
}
  
  
Řádka 177: Řádka 199:
 
* intersecting objects ... objekty, které se prolínají se stávajícím (došlo ke kolizi)
 
* 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
 
* objects at offset ... objekty, které jsou v dané vzdálenosti (dx, dy) od stávajícího objektu
 
== Řešení typických situací ==
 
=== 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);
 
        }
 
    }
 
}
 
 
=== 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é vzory#Jedináček|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 HraWorld() {
 
    ...
 
    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.
 
 
=== Zdi ===
 
  
  
Řádka 263: Řádka 209:
  
  
== Další stránky ==
+
== 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ů]].
 
* Máte-li probém se spouštěním aplikací na webu Greenfoot.org, zkuste: [[Spouštění appletů]].

Verze z 18. 2. 2016, 14:33


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í aktérů

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


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


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)


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


Náhodná čísla

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


Zjištění kolize prvků 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 = 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


Úkol: Zkuste si vytvořit hru!


Související stránky

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