Skip to content
Snippets Groups Projects
Palikat.cs 7.51 KiB
Newer Older
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Runtime.CompilerServices;
using Jypeli;
using Jypeli.Assets;
using Jypeli.Controls;
using Jypeli.Widgets;
//using Silk.NET.GLFW;
//using Silk.NET.Windowing;

namespace Palikat;

/// @author Atte Tuliainen
/// @version 25.09.2023
/// <summary>
/// Tämä on 2020-luvun versio klassisesta pulmapelistä, jossa erikokoiset palikat siirretään pinosta toiseen pinoon koko järjestykseen.
/// Haastetta tuo sallittujen siirtojen säännöt ja aika. 
/// </summary>
public class Palikat : PhysicsGame
{
    //Luodaan taulukko jonka pohjalta luodaan kenttä ja oliot peliin
    private static readonly String[] kentta = {
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                                   ",
        "                 3                 ",
        "                 2                 ",
        "                 1                 ",
        "        =        =        =        ",
    private static readonly int tileWidth = 1500 / kentta[0].Length;
    private static readonly int tileHeight = 1000 / kentta.Length;
    
    public override void Begin()
    {
        // Luodaan pelialue ja määritetään taustan väri
        Level.BackgroundColor = Color.Black;
        
        // lisätään pieni paivovoima, jotta palikat asettuvat kivasti paikalleen
        Gravity = new Vector(0, -50);
        TileMap tiles = TileMap.FromStringArray(kentta);
        //Määritetään pelin osien mappaus piirrettyyn kenttään sekä osien väri
        tiles.SetTileMethod('1', LuoPalikka1, Color.Yellow); //palikka1
        tiles.SetTileMethod('2', LuoPalikka2, Color.Yellow); //palikka2
        tiles.SetTileMethod('3', LuoPalikka3, Color.Yellow); //palikka3
        tiles.SetTileMethod('=', LuoAlusta, Color.Gray); //alustat
        tiles.Execute(tileWidth, tileHeight);
        
        //Kohdistetaan kamera pelialueeseen
        Level.CreateBorders(1,1,2,1,Color.White);  
        
        Camera.ZoomToAllObjects();

        Kontrollit();
        
    //Ohjaimet pelaamiseen
    void Kontrollit()
    { 
        Console.WriteLine("testikontrolli");
        ///TO-DO pelin hiiren kontrollit tähän
    }
    //Pelistä poistuminen
        PhoneBackButton.Listen(ConfirmExit, "Lopeta peli");
        Keyboard.Listen(Key.Escape, ButtonState.Pressed, ConfirmExit, "Lopeta peli");

    /// <summary>
    /// Luodaan palikat
    /// TO-DO: Muuta palikoiden luonti yhteen aliohjelmaa ja siten että palikoita voidaa kutsua muualta esim. kontrolleja varten
    /// </summary>
    private void LuoPalikka1(Vector paikka, double leveys, double korkeus, Color vari)
        PhysicsObject palikka1 = new PhysicsObject(leveys*6, korkeus);
        palikka1.Position = paikka;
        palikka1.Color = vari;
        palikka1.Image = LoadImage("palikka1");
        palikka1.Tag = "palikka";
        Add (palikka1);
        AddCollisionHandler(palikka1, "alusta", Palikka1OsuuAlustaan);
        
        Mouse.ListenOn(palikka1, MouseButton.Left, ButtonState.Down, TartuPalikkaan, "Ota kiinni palikasta");
        void TartuPalikkaan()
        {
            //Hiiren käyttö
            Mouse.IsCursorVisible = true;
            palikka1.Position = Mouse.PositionOnWorld;
        }
    private void LuoPalikka2(Vector paikka, double leveys, double korkeus, Color vari)
    {
        PhysicsObject palikka2 = new PhysicsObject(leveys*4, korkeus);
        palikka2.Position = paikka;
        palikka2.Color = vari;
        palikka2.Image = LoadImage("palikka2");
        palikka2.Tag = "palikka";
        
        Add(palikka2);
        AddCollisionHandler(palikka2, "alusta", Palikka2OsuuAlustaan);
        
        Mouse.ListenOn(palikka2, MouseButton.Left, ButtonState.Down, TartuPalikkaan, "Ota kiinni palikasta");
        void TartuPalikkaan()
        {
            //Hiiren käyttö
            Mouse.IsCursorVisible = true;
            palikka2.Position = Mouse.PositionOnWorld;
        }
    }
    
    private void LuoPalikka3(Vector paikka, double leveys, double korkeus, Color vari)
    {
        PhysicsObject palikka3 = new PhysicsObject(leveys*2, korkeus);
        palikka3.Position = paikka;
        palikka3.Color = vari;
        palikka3.Image = LoadImage("palikka3");
        palikka3.Tag = "palikka";
        
        Add(palikka3);
        AddCollisionHandler(palikka3, "palikka", Palikka1OsuuPalikkaan3);
        AddCollisionHandler(palikka3, "alusta", Palikka3OsuuAlustaan);
        
        Mouse.ListenOn(palikka3, MouseButton.Left, ButtonState.Down, TartuPalikkaan, "Ota kiinni palikasta");
        void TartuPalikkaan()
        {
            //Hiiren käyttö
            Mouse.IsCursorVisible = true;
            palikka3.Position = Mouse.PositionOnWorld;
        }
    }
    

    /// <summary>
    /// Luodaan alustat
    /// </summary>
    public void LuoAlusta(Vector paikka, double leveys, double korkeus, Color vari)
        PhysicsObject alusta = new PhysicsObject(leveys*8, korkeus);
        alusta.Position = paikka;
        alusta.Color = vari;
        alusta.Image = LoadImage("platform");
        alusta.Tag = "alusta";
        Add(alusta);
    ///Määritellään säännöt/rajoiteet
    private void Palikka1OsuuAlustaan(PhysicsObject palikka1, PhysicsObject alusta)
    {
        //laskurin arvo kasvaa
        Console.WriteLine("Palikka1 osui alustaan");
        //siirtolaskuri.Value += 1;
    }

    private void Palikka2OsuuAlustaan(PhysicsObject palikka2, PhysicsObject alusta)
    {
        //laskurin arvo kasvaa
        Console.WriteLine("Palikka2 osui alustaan");
    }
    private void Palikka3OsuuAlustaan(PhysicsObject palikka3, PhysicsObject alusta)
    {
        //laskurin arvo kasvaa
        Console.WriteLine("Palikka3 osui alustaan");
    }
    void Palikka1OsuuPalikkaan2(PhysicsObject palikka1, PhysicsObject palikka2)
    {
        //laskurin arvo kasvaa
        //tarkista onko palikat oikeassa järjestyksessä
        Console.WriteLine("palikka1 osui palikka2");
    }
    
    void Palikka1OsuuPalikkaan3(PhysicsObject palikka1, PhysicsObject palikka3)
    {
        //laskurin arvo kasvaa
        //tarkista onko palikat oikeassa järjestyksessä
        Console.WriteLine("palikka1 osui palikka3");
    }
    
    void Palikka2OsuuPalikkaan3(PhysicsObject palikka2, PhysicsObject palikka3)
    {
        //laskurin arvo kasvaa
        //tarkista onko palikat oikeassa järjestyksessä
        Console.WriteLine("palikka2 osui palikka3");
    }
    
    //luodaan laskuri, joka laskee montako siirtoa pelaaja on tehnyt
    private IntMeter pistelaskuri;

    void LuoPistelaskuri()
    {
        pistelaskuri = new IntMeter(0);

        Label siirtolaskuri = new Label();
        siirtolaskuri.X = Screen.Left +55;
        siirtolaskuri.Y = Screen.Top -60;
        siirtolaskuri.TextColor = Color.BloodRed;
        siirtolaskuri.Color = Color.Black;
        siirtolaskuri.IntFormatString = "Siirrot: {0:D3}";
        siirtolaskuri.BindTo(pistelaskuri);
        Add(siirtolaskuri);
    }