Skip to content
Snippets Groups Projects
Main.hs 5.29 KiB
module Main where
import Graphics.Gloss
import Graphics.Gloss.Interface.Pure.Game
import Prelude hiding (Down) -- peruskirjastossa oli määritelmä Down, joka nyt piilotettiin (vaikuttaa sort funktion järjestystä)
import Graphics.Gloss.Geometry.Angle
import Graphics.Gloss.Data.Vector


main :: IO ()
main = play
        (InWindow "Choplifter klooni" (400,400) (200,200)) --Display  -- eka pari ikkunan koko, jälkimmäisestä ei hajuakaan
        ( light blue)  -- Color
        60 -- Int montako kuvaa sekunnissa -- 24 alunp.
        (Peli 0 (10, 0) 0 (0,0) 0)  -- model
        piirräPeli  -- function to convert model to picture
        reagoi -- keskeytys
        päivitäPeliä -- function to step the model one iteration

-- "Animaatio on funktio joka ottaa ajan ja tuottaa kuvan. Se on ihan hauska ajatus"

reagoi :: Event -> Choplifter -> Choplifter  -- Event -> world -> world
reagoi tapahtuma peli
  = case tapahtuma of -- event voi olla hiirenliikkauksia, näppäimenpainalluksia jne
      EventKey (Char 'p') Down _ _ -> muutaTehoa 7 peli  -- char, special key tai mouse button, kaksi koordinaattia luultavasti hiiren
      EventKey (Char 'ö') Down _ _ -> muutaTehoa (-7) peli
      EventKey (Char 'l') Down _ _ -> liikutaVaakasuunnassa (-2) (kallista (-8) peli)
        -- let
        --   kallistettuAlus :: Choplifter -> Choplifter
        --   kallistettuAlus = kallista (-8)
        --   liikutettuAlus :: Choplifter -> Choplifter
        --   liikutettuAlus = liikutaVaakasuunnassa (-30)
        -- in liikutettuAlus (kallistettuAlus peli)
      EventKey (Char 'ä') Down _ _ -> liikutaVaakasuunnassa 2 (kallista 8 peli)
      _ -> peli -- jos painallus joku muu ei tehdä mitään

-- funktio joka muuttaa Pelin kuvaksi
päivitäPeliä :: Float -> Choplifter -> Choplifter
päivitäPeliä aikaEdellisestä edellinenTila
  = case edellinenTila of 
      Peli aika (kopteriX,kopteriY)
                teho (nX, nY) kulma
        -> let
            (vX,vY) = kulmaJaTehoNopeudeksi teho kulma -- mites saa hidastumaan...? Mieti itse! §

        in Peli (aika + aikaEdellisestä)
                (kopteriX+aikaEdellisestä*21*vX + nX*aikaEdellisestä*21,
                max 0 (kopteriY+aikaEdellisestä*21*vY - 3)) -- köyhän miehen painovoima tuo miinus
                teho
                (nX, nY)
                kulma


kulmaJaTehoNopeudeksi :: Float -> Float -> (Float,Float)
kulmaJaTehoNopeudeksi teho kulma  -- Tässä gloss menee opettajasta metsään, koska sotketaan että Point ja Vector voivat olla sama asia (molemmissa x ja y), vaikka niillä on ihan eri _tarkoitus_
  = rotateV (- degToRad kulma) (0, teho) -- otetaan vektori joka suoraan ylöspäin se teho  -- rotateV ottaa kulman radiaaneina...

piirräPeli :: Choplifter -> Picture
piirräPeli peli = case peli of
                    Peli aika (kopteriX, kopteriY)
                              _teho (_nopeusX, _nopeusY) kulma  -- suunta
                      -> let
                          kopterikuva = rotate kulma (scale 0.4 0.4 (kopteri 20 aika))
                          peliKuva = translate kopteriX kopteriY kopterikuva
                                  <> maa
                         in scale 0.25 0.25 (translate 0 (-180) peliKuva)

kallista :: Float -> Choplifter -> Choplifter
kallista muutos peli = case peli of
                          Peli aika paikka teho (nopX, nopY) kulma
                            -> Peli aika paikka teho (nopX, nopY) (kulma + muutos)

muutaTehoa :: Float -> Choplifter -> Choplifter
muutaTehoa muutos peli = case peli of
                    Peli aika paikka teho (suuntaX, suuntaY) kulma
                      -> Peli aika paikka (teho+muutos) (suuntaX,suuntaY) kulma

liikutaVaakasuunnassa :: Float -> Choplifter -> Choplifter
liikutaVaakasuunnassa muutosX peli = case peli of
                      Peli aika paikka teho (suuntaX, suuntaY) kulma
                        -> Peli aika paikka teho (suuntaX+muutosX, suuntaY) kulma

data Choplifter  -- modelin tilalle tehdäänkin tämä  -- tehdään tietotyyppi, johon survotaan kaikki olioiden tilat, sen sijaan että olsi yksi möntti (olio-ohjelmoinnissa), johon säilöttäisiin tilat, tehdään paljon funktioita jotka käsittelevät sitä paskaa
  = Peli
      Float -- Aika pelin alusta
      (Float, Float) -- Missä kopteri (kopteriX, kopteriY)
      Float   -- Teho
      (Float, Float)  -- nopeus vektorina (suuntaX, suuntaY)
      Float  -- Kulma eli kuinka vinossa

maa :: Picture
maa = color green (translate 0 (-500) (rectangleSolid 5000 1000))

kopteri :: Float -> Float -> Picture
kopteri teho aika = translate 0 150 (color white runko)
  where
    runko = arcSolid 0 0 100 --circleSolid 100
            <> translate (-200) 0 (rectangleSolid 300 30)  -- mikäs tämä <> olikaan..
            <> translate (-350) 0 (rectangleSolid 50 100)
            <> lapa -- pallo on puoliryhmien yhdistämisoperaatio... eli vähän kuin + joka toimii kuville... ja teksteille (kans puoliryhmiä) ja listoille...
            <> translate 0 90     (rectangleSolid 10 120)

            <> translate (-50) (-90)  (rectangleSolid 10 120)
            <> translate (50) (-90)   (rectangleSolid 10 120)
            <> translate 0 (-150)     (rectangleSolid 200 15)
    lapa = translate 0 150 (rectangleSolid (350 * sin (aika * teho)) 10)   -- sini funktiohan on kätevästi tasaisen vaihteleva x:n (vaikkapa sitten ajan) suhteen!