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