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)
(Výpis stavu hry, hlášky: Přidán návrhový vzor Jedináček.)
Řádka 150: Řádka 150:
 
=== 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):
+
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
 
  public class Pocitadlo extends Actor
 
  {
 
  {
     public Pocitadlo() {
+
    // Implementace Jedináčka:
         this.zmenStav(0);
+
    private static Pocitadlo prvniHrac = null;
 +
     public static Pocitadlo getInstance() {
 +
         if (this.prvniHrac == null)
 +
            this.prvniHrac = new Pocitadlo();
 +
        }
 +
        return this.prvniHrac;
 
     }
 
     }
     public void zmenStav(int stav) {
+
   
         String text = "Skóre: "+stav;
+
    // A zbytek kódu:
         GreenfootImage vzhled = new GreenfootImage(text, 20, Color.yellow, Color.gray);
+
    private int stav;
         this.setImage(vzhled);
+
   
 +
    '''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);
 
     }
 
     }
 
  }
 
  }
  
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.
+
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: 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, 10:30


Obsah

Co je to Greenfoot?

Dokumentaci tříd najdete na adrese:

Svět a volání metod act()

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

Vytvoření a přidání Actorů

Pohyb Actora

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

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

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: Vytvořte hru!

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