Skip to content
Snippets Groups Projects
KentanMuokkaus.cs 5.52 KiB
Newer Older
Vesa Lappalainen's avatar
Vesa Lappalainen committed
using Jypeli;

namespace KentanMuokkaus;

/// @author Vesa Lappalainen
/// @version 10.10.2020
///
/// <summary>
/// Ohjelmassa harjoitellaan 2-ulotteisen
/// merkkitaulukon (char[,]) hyodyntamista kentan
/// luomisessa.
/// </summary>
public class KentanMuokkaus : PhysicsGame
{
    private PhysicsObject pelaaja; // Liikuteltava pallo, jota pystytään
                                   // liikuttamaan kaikista tämän luokan aliohjelmista
    private const int KOKO = 20; // paljonko on yksittäisen palikan koko.
                         // huom const eli vakio! (ei voi muuttaa)

    /// <summary>
    /// Asetetaan painovoima ja kutsutaan alustuksiin
    /// liittyvia aliohjelmia. Aloitetaan peli.
    /// Zoomataan kamera.
    /// </summary>
    public override void Begin()
    {
        // SetWindowSize(1000, 700);
        Level.Width = 100;
        Level.Height = 100;
        char[,] kentta = {
                {'P', '.', 'P'},
                {'.', 'O', 'n'},
                {'n', '.', 'P'},
                {'O', ' ', 'P'},
                         };
        // Gravity = new Vector(0, -1000);
        TeeKentta(kentta);
        AsetaOhjaimet();
        Level.CreateBorders();
        Camera.ZoomToLevel();
    }


    /// <summary>
    /// Luodaan pelikentta 2-ulotteisen merkkitaulukon (char[,])
    /// avulla. Kutsutaan aliohjelmia eri merkeille luotujen merkitysten
    /// perusteella.
    /// </summary>
    private void TeeKentta(char[,] kentta)
    {
        double alkuX = Level.Left + KOKO / 2.0 + 20;
        double alkuY = Level.Top - KOKO / 2.0;


        double y = alkuY;

        // Kaydaan rivit ja sarakkeet lapi.
        // "Muutetaan" merkkitaulukko kentaksi siten
        // etta tietyt merkit vastaavat tietyn kentalle lisattavan olion
        // aliohjelmakutsua. Myos koordinaatit saadaan matriisista:
        // Rivi toimii x-koordinaattina, ja sarake y-koordinaattina.
        for (int iy = 0; iy < kentta.GetLength(0); iy++)
        {
            double x = alkuX;
            for (int ix = 0; ix < kentta.GetLength(1); ix++)
            {
                char t = kentta[iy, ix];

                switch (t)
                {
                    case 'P':
                        LuoPalikka(x, y);
                        break;
                    case 'n':
                        LuoNelio(x, y);
                        break;
                    case 'O':
                        LuoYmpyra(x, y);
                        break;
                    case '.':
                        LuoPelaaja(x, y);
                        break;
                }
                x += KOKO;
            }
            y -= KOKO;
        }
    }


    /// <summary>
    /// Lisataan pallo kentalle ja annetaan pallolle massa.
    /// </summary>
    /// <param name="x">Pallon kp x-koordinaatti</param>
    /// <param name="y">Pallon kp y-koordinaatti</param>
    private void LuoPelaaja(double x, double y)
    {
        pelaaja = new PhysicsObject(KOKO / 2.0, KOKO / 2.0, Shape.Circle);
        pelaaja.Position = new Vector(x, y);
        pelaaja.Color = Color.Red;
        Add(pelaaja);
    }


    /// <summary>
    /// Lisataan staattinen suorakulmio (nelio) kentalle
    /// annettuun paikkaan.
    /// </summary>
    /// <param name="x">Nelion kp x-koordinaatti</param>
    /// <param name="y">Nelion kp y-koordinaatti</param>
    private void LuoPalikka(double x, double y)
    {
        PhysicsObject palikka = PhysicsObject.CreateStaticObject(KOKO, KOKO);
        Add(palikka);
        palikka.Image = LoadImage("tiili2");
        palikka.Position = new Vector(x, y);
    }


    /// <summary>
    /// Lisataan pieni staattinen suorakulmio (nelio) kentalle
    /// annettuun paikkaan.
    /// </summary>
    /// <param name="x">Nelion kp x-koordinaatti</param>
    /// <param name="y">Nelion kp y-koordinaatti</param>
    private void LuoNelio(double x, double y)
    {
        PhysicsObject palikka = PhysicsObject.CreateStaticObject(KOKO / 2.0, KOKO / 2.0);
        Add(palikka);
        palikka.Color = Color.Blue;
        palikka.Position = new Vector(x, y);
    }


    /// <summary>
    /// Tehdaan staattinen ympyra
    /// ja lisataan se pelikentalle
    /// annettuun paikkaan.
    /// </summary>
    /// <param name="x">Ympyran kp x-koordinaatti</param>
    /// <param name="y">Ympyran kp y-koordinaatti</param>
    private void LuoYmpyra(double x, double y)
    {
        PhysicsObject pallo = PhysicsObject.CreateStaticObject(KOKO, KOKO, Shape.Circle);
        this.Add(pallo);
        pallo.Color = Color.Yellow;
        pallo.Position = new Vector(x, y);
    }


    /// <summary>
    /// Asetetaan nappaintenkuuntelijat.
    /// </summary>
    private void AsetaOhjaimet()
    {
        const int voima = 10;
        Keyboard.Listen(Key.Up, ButtonState.Pressed, LiikutaPalloa, "Ylös", new Vector(0, voima));
        Keyboard.Listen(Key.Down, ButtonState.Pressed, LiikutaPalloa, "Alas", new Vector(0, -voima));
        Keyboard.Listen(Key.Left, ButtonState.Pressed, LiikutaPalloa, "Vasemmalle", new Vector(-voima, 0));
        Keyboard.Listen(Key.Right, ButtonState.Pressed, LiikutaPalloa, "Oikealle", new Vector(voima, 0));

        // Ohjeiden näyttämistä varten. Paina F1 pelin aikana.
        Keyboard.Listen(Key.F1, ButtonState.Pressed, ShowControlHelp, "Ohjeet");

        Keyboard.Listen(Key.Escape, ButtonState.Pressed, Exit, "Poistu");
    }

    /// <summary>
    /// Aliohjelma liikuttaa palloa.
    /// </summary>
    /// <param name="suunta">Suunta, johon palloa liikutetaan.</param>
    private void LiikutaPalloa(Vector suunta)
    {
        pelaaja.Hit(suunta);
    }

}