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 8 peli -- char, special key tai mouse button, kaksi koordinaattia luultavasti hiiren EventKey (Char 'ö') Down _ _ -> muutaTehoa (-8) peli EventKey (Char 'l') Down _ _ -> liikutaVaakasuunnassa (-2) (kallista (-12) peli) -- let -- kallistettuAlus :: Choplifter -> Choplifter -- kallistettuAlus = kallista (-8) -- liikutettuAlus :: Choplifter -> Choplifter -- liikutettuAlus = liikutaVaakasuunnassa (-30) -- in liikutettuAlus (kallistettuAlus peli) EventKey (Char 'ä') Down _ _ -> liikutaVaakasuunnassa 2 (kallista 12 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 - 10)) -- 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 (max teho 1) 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 <> color (greyN 0.1) takaroottori <> translate (-200) 0 (rectangleSolid 300 30) -- mikäs tämä <> olikaan.. <> translate (-350) 0 (rectangleSolid 50 100) <> color (greyN 0.1) 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 (400 * sin (aika * teho)) 15) -- sini funktiohan on kätevästi tasaisen vaihteleva x:n (vaikkapa sitten ajan) suhteen! takaroottori = translate (-350) 0 (rotate (aika*teho*70) (rectangleSolid 165 10))