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!