Príloha 11 – ďalšie verzie tried AnimovanýObjekt, Prievozník a HlavnáTrieda
Prevziať
AnimovanýObjekt
public class AnimovanýObjekt extends GRobot
{
private static Prievozník prievozník;
public static void prievozník(Prievozník prievozník)
{
AnimovanýObjekt.prievozník = prievozník;
}
public static Prievozník prievozník()
{
return prievozník;
}
// Fixný počet fáz animácie pri chôdzi.
private final static int fázChôdze = 2;
private Pozícia pozícia = Pozícia.pravýBreh;
// Premenné zvuk, obrázokDoľava a obrázokDoprava budú obsahovať
// názvy súborov podľa vnútorne dohodnutej schémy.
private String meno, zvuk;
private String obrázokDoľava[] = new String[1 + fázChôdze];
private String obrázokDoprava[] = new String[1 + fázChôdze];
private AnimovanýObjekt cieľ;
private double posunX, posunY;
private double ľavýX = 0, ľavýY = 0;
private double pravýX = 0, pravýY = 0;
private double posunPopisuX;
private double posunPopisuY;
private int fázaChôdze = 0; // Ak je hodnota nulová, znamená to,
// že objekt nie je animovaný.
public AnimovanýObjekt(String meno, double posunX, double posunY,
double posunPopisuX, double posunPopisuY)
{
zdvihniPero();
// Inicializujem názvy súborov podľa dohody.
obrázokDoľava[0] = "súbory/" + meno + "-ľ.png";
obrázokDoprava[0] = "súbory/" + meno + "-p.png";
zvuk = "súbory/" + meno + ".wav";
this.meno = meno;
this.posunX = posunX;
this.posunY = posunY;
this.posunPopisuX = posunPopisuX;
this.posunPopisuY = posunPopisuY;
spôsobKreslenia(KRESLI_NA_STRED);
rýchlosť(10, false);
}
@Override public void kresliTvar()
{
skoč(posunX, posunY);
if (vPohybe() && fázaChôdze != 0)
{
if (smer() >= 90 && smer() <= 270)
obrázok(obrázokDoľava[fázaChôdze]);
else
obrázok(obrázokDoprava[fázaChôdze]);
}
else if (smer() >= 90 && smer() <= 270)
obrázok(obrázokDoľava[0]); else obrázok(obrázokDoprava[0]);
domov();
if (myšV())
{
skoč(posunPopisuX, posunPopisuY);
text(meno);
}
}
public boolean vPohybe()
{
return aktívny();
}
public boolean myšV()
{
return myšVElipse(50, 60);
}
public boolean pravýBreh()
{
return pozícia == Pozícia.pravýBreh;
}
public boolean ľavýBreh()
{
return pozícia == Pozícia.ľavýBreh;
}
public Pozícia pozícia()
{
return pozícia;
}
public void nastavĽavý(double x, double y)
{
ľavýX = x;
ľavýY = y;
}
public void nastavPravý(double x, double y)
{
pravýX = x;
pravýY = y;
}
public void umožniAnimáciuChôdze()
{
for (int i = 1; i <= fázChôdze; ++i)
{
obrázokDoľava[i] = "súbory/" + meno + "-ľ-" + i + ".png";
obrázokDoprava[i] = "súbory/" + meno + "-p-" + i + ".png";
}
fázaChôdze = 1;
}
public void choďNaĽavý()
{
if (pozícia == Pozícia.prievozník)
prievozník.uvoľniPalubu();
cieľ = null;
cieľ(ľavýX, ľavýY);
pozícia = Pozícia.ľavýBreh;
}
public void choďNaPravý()
{
if (pozícia == Pozícia.prievozník)
prievozník.uvoľniPalubu();
cieľ = null;
cieľ(pravýX, pravýY);
pozícia = Pozícia.pravýBreh;
}
public void choďNaPrievozníka()
{
if (this instanceof Pasažier)
prievozník().naPalubu((Pasažier)this);
cieľ(cieľ = prievozník);
pozícia = Pozícia.prievozník;
}
@Override public void dosiahnutieCieľa()
{
cieľ = null;
}
@Override public void aktivita()
{
if (null != cieľ) upravCieľ(cieľ);
// Nenulová hodnota fázy animácie znamená, že sme vykonali potrebné
// nastavenia, aby mohol byť objekt animovaný.
if (fázaChôdze != 0 && ++fázaChôdze > fázChôdze) fázaChôdze = 1;
}
// Jednoduchšie riešenie:
// @Override public void pasivita()
// { if (pozícia == Pozícia.prievozník) skočNa(prievozník); }
@Override public void pracuj()
{
if (!vPohybe() && pozícia == Pozícia.prievozník)
{
skočNa(prievozník);
}
// Zavoláme verziu metódy „pracuj“ nadradenej triedy:
super.pracuj();
}
// Urobíme výnimku a publikujeme jednu metódu predčasne. Toto bude jediná
// zmena, ktorú vykonáme v tejto triede v nasledujúcej kapitole.
public void vydajZvuk()
{
svet.zvuk(zvuk);
}
}
Prievozník
public class Prievozník extends AnimovanýObjekt
{
private final static int rozptylBrehov = 90;
private final static int posunGrafikyX = -30;
private final static int posunGrafikyY = 10;
private final static int posunPopisuX = -30;
private final static int posunPopisuY = 115;
public Prievozník()
{
super("prievozník", posunGrafikyX, posunGrafikyY,
posunPopisuX, posunPopisuY);
domov(50, -25, 0); // domovská pozícia [x, y] a domovský uhol
zrýchlenie(2, false);
nastavĽavý(domaX() - rozptylBrehov, domaY());
nastavPravý(domaX() + rozptylBrehov, domaY());
prievozník(this);
}
public void prejdiRieku()
{
if (pravýBreh())
choďNaĽavý();
else
choďNaPravý();
}
@Override public boolean myšV()
{
skoč(-30, 0);
boolean myšV = myšVElipse(90, 120);
skoč(30, 0);
return myšV;
}
// --- Vlastnosť „na palube“ spravujúca obsah paluby ---
private Pasažier naPalube = null;
public boolean niektoNaPalube()
{
return null != naPalube;
}
public void uvoľniPalubu()
{
naPalube = null;
}
public void naPalubu(Pasažier ktorý)
{
if (null != naPalube) naPalube.choď();
naPalube = ktorý;
}
}
HlavnáTrieda
public class HlavnáTrieda extends GRobot
{
private final Prievozník prievozník = new Prievozník();
private final Pasažier vlk = new Pasažier("vlk", 0, 0, 0, 65, 200, 10);
private final Pasažier koza = new Pasažier("koza", 0, -10, -5, 50, 280, 10);
private final Pasažier kapusta = new Pasažier("kapusta", 0, -25, 0, 25, 360, 10)
{
@Override public boolean myšV()
{
skoč(0, -30);
boolean myšV = myšVKruhu(45);
skoč(0, 30);
return myšV;
}
};
private HlavnáTrieda()
{
super(800, 300, "Prievozník…");
svet.zbaľ();
prievozník.choďNaPravý();
vlk.choďNaPravý();
koza.choďNaPravý();
kapusta.choďNaPravý();
new ObsluhaUdalostí()
{
@Override public void klik()
{
if (vlk.myšV()) vlk.choď();
else if (koza.myšV()) koza.choď();
else if (kapusta.myšV()) kapusta.choď();
else if (prievozník.myšV()) prievozník.prejdiRieku();
}
};
aktivuj();
}
public static void main(String[] args)
{
new HlavnáTrieda();
}
}