diff --git a/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.hi b/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.hi index acb86521bc6735c758c61d7698bddcf7d2629d31..870037fa34b002eb939ba952aae8c70d1d47022b 100644 Binary files a/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.hi and b/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.hi differ diff --git a/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.o b/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.o index 99dafc9cdd93bcd581e808fec2888cda2f2cd0d6..cfdbb2a0613a4129cb309bd72d818159de2cfb08 100644 Binary files a/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.o and b/.stack-work/dist/29cc6475/build/choplifter/choplifter-tmp/Main.o differ diff --git a/.stack-work/dist/29cc6475/build/choplifter/choplifter.exe b/.stack-work/dist/29cc6475/build/choplifter/choplifter.exe index 094e4bc4bf5ce3ff2e8f9a63bac14bd8b0735015..0a66540561d496159f284f3e3969440723cd16f5 100644 Binary files a/.stack-work/dist/29cc6475/build/choplifter/choplifter.exe and b/.stack-work/dist/29cc6475/build/choplifter/choplifter.exe differ diff --git a/.stack-work/dist/29cc6475/stack-build-caches/6eb920625479cbea8700e1720c6b6df9985d350a35c1107cb4b076b0c0ef5da3/exe-choplifter b/.stack-work/dist/29cc6475/stack-build-caches/6eb920625479cbea8700e1720c6b6df9985d350a35c1107cb4b076b0c0ef5da3/exe-choplifter index 636d2d12af47bbe3209dac4f8ffdbff844a71f88..8a51d0818ac074061f76ce217e188900702074c9 100644 --- a/.stack-work/dist/29cc6475/stack-build-caches/6eb920625479cbea8700e1720c6b6df9985d350a35c1107cb4b076b0c0ef5da3/exe-choplifter +++ b/.stack-work/dist/29cc6475/stack-build-caches/6eb920625479cbea8700e1720c6b6df9985d350a35c1107cb4b076b0c0ef5da3/exe-choplifter @@ -7,6 +7,6 @@ C:\Users\Juuso\source\choplifter\choplifter.cabal: size: 1271 modtime: 1603193097 C:\Users\Juuso\source\choplifter\src\Main.hs: - hash: b7e12f343b8cd4b430b8311f28523946c2b8b3bfaa3736e2f2e3886840d85e33 - size: 16467 - modtime: 1603713654 + hash: 5bd4807a924823ca1a2f2c3826216ce98094fc29afe0ae6e803270aaf6cd8e41 + size: 17829 + modtime: 1603717176 diff --git a/.stack-work/install/fe9ce87a/bin/choplifter.exe b/.stack-work/install/fe9ce87a/bin/choplifter.exe index 692d8251554c1db5fdda2c434b0ea39337c9394b..6e4f938729e5cc7652a06ead33b98fc23406c8b0 100644 Binary files a/.stack-work/install/fe9ce87a/bin/choplifter.exe and b/.stack-work/install/fe9ce87a/bin/choplifter.exe differ diff --git a/.stack-work/stack.sqlite3 b/.stack-work/stack.sqlite3 index 6bd0ff5c7b9333f0fb0891a519f1e0c3c11fea58..6b1a21b638c98bc1aef0222761b728793317b91b 100644 Binary files a/.stack-work/stack.sqlite3 and b/.stack-work/stack.sqlite3 differ diff --git a/src/Main.hs b/src/Main.hs index deaccd3d51a22aa65b3ea5de7672cd0ecaa2f775..1885e1feaad1ea53d7833beff2f4ad8a0ccd014c 100644 --- a/src/Main.hs +++ b/src/Main.hs @@ -4,6 +4,7 @@ import Graphics.Gloss.Interface.Pure.Game import Graphics.Gloss.Geometry.Angle import Graphics.Gloss.Data.Vector import Graphics.Gloss.Geometry.Line +import Data.List (partition) -- importtaa vain partitionin (ei haluta kaikkia nimiä sotkemaan koodia) import Prelude hiding (Down) -- peruskirjastossa oli määritelmä Down, joka nyt piilotettiin (vaikuttaa sort funktion järjestystä) alkutilanne :: PeliTilanne @@ -16,8 +17,8 @@ alkutilanne = 0 0 0 -- hemmoja - [Talo 100 300 500] - [Hemmo (700, 800), Hemmo (900, 800)] + [Talo 100 400 500] + [Hemmo (400, 100), Hemmo (600, 100)] ) -- main :: IO () @@ -65,7 +66,7 @@ pysäytäPystyssä (vx, vy) = (vx, max 0 vy) onkoHyväLaskeutuminen :: Vector -> Float -> Bool -- nopeus, kulma ja -> Bool onkoHyväLaskeutuminen nopeus kulma - | magV nopeus < 120 && abs kulma <= 10 = True -- magV laskee vektoreista niiden kokonaismitan (kuinka pitkä vektori) + | magV nopeus < 250 && abs kulma <= 13 = True -- magV laskee vektoreista niiden kokonaismitan (kuinka pitkä vektori) | otherwise = False päivitäPeliTilanne :: Float -> PeliTilanne -> PeliTilanne @@ -86,7 +87,16 @@ päivitäPeliTilanne aikaedellisestä pelitilanne = päivitäPeliä :: Float -> Choplifter -> Choplifter päivitäPeliä aikaEdellisestä edellinenTila = case edellinenTila of - Peli aika (kopteriX,kopteriY) teho (vX, vY) kulma kiihtyvyysKerroin hemmojKyydis talot hemmot + Peli + aika + (kopteriX,kopteriY) + teho + (vX, vY) + kulma + kiihtyvyysKerroin + hemmojaKyydissä + talot + hemmot -> let (dX,dY) = kulmaJaTehoKiihtyvyydeksi teho kulma -- mites saa hidastumaan...? Mieti itse! § laskeKiihtyvKerroin = case teho < 0.01 of @@ -94,18 +104,18 @@ päivitäPeliä aikaEdellisestä edellinenTila True -> kiihtyvyysKerroin + 0.07 False -> 6 False -> 1 -- asetetaan kiihtKerroin ykköseen - - -- HUOM! Nyt tuo nopeus muuttuukin "realistisesti". Jos haluat, lisää myös se, että liikkuu "itsestään" ilman tehoakin (eli muuttaa suoraan x ja y koordinaatteja). + nouseekoKyytiin hemmo = magV (hemmo_sijainti hemmo #- (kopteriX,kopteriY)) < 50 + (hemmotKopteriin, _hemmotUlkona) = partition nouseekoKyytiin hemmot in Peli (aika + aikaEdellisestä) (kopteriX+aikaEdellisestä * vX, -- tässä tuo vanha liikkuminen talteen: + (vX*aikaEdellisestä*10), - max 0 (kopteriY+aikaEdellisestä * vY)) -- köyhän miehen painovoima tuo miinus... Kato perkele, tässä on määrätty että ei voi mennä "maasta läpi". Toisin sanoen kopterin y-koordinaatti ei voi alittaa kohtaa 0. + max 0 (kopteriY+aikaEdellisestä * vY)) -- köyhän miehen painovoima tuo miinus... Kato perkele, tässä on määrätty että ei voi mennä "maasta läpi". Toisin sanoen kopterin y-koordinaatti ei voi alittaa kohtaa 0. teho ((vX + dX) * 0.97, ((vY + dY) * 0.97) - 10 * kiihtyvyysKerroin) -- olkoon tuo kerroin kuin ilmanvastus kulma laskeKiihtyvKerroin - hemmojKyydis + (hemmojaKyydissä + genericLength hemmotKopteriin) -- kadotetaan loput talot - hemmot + (map (päivitäHemmoa edellinenTila) hemmot) -- HUOM! TODO: Oikeasti kaikki missä summataan tässä päivitäPeliä, pitäisi -- oikeasti kertoa tuolla aikaEdellisestä, mutta se vaatii vähän arvojen -- ja ehkä koodinkin muokkaamista! @@ -250,18 +260,47 @@ data Choplifter -- modelin tilalle tehdäänkin tämä -- tehdään tietotyypp ,cl_hemmot :: [Hemmo] } -- Annettiin cl_nimet koska muuten voisi tulla inhimillisiä virheitä helpommin +korkeusKohdassa :: Float -> Choplifter -> Float -- korkeuskoordinaatti eka arg +korkeusKohdassa kohta peli = maybe 0 maximum1 . nonEmpty . map osuukoTaloon . cl_talot $ peli +-- selkeämpi kylläkin tehdä näin: maybe 0 maximum1 (nonEmpty (map osuukoTaloon (cl_talot peli))) + where + osuukoTaloon :: Talo -> Float + osuukoTaloon talo + | abs (talo_sijainti talo - kohta) < (talo_leveys talo / 2) = talo_korkeus + talo + | otherwise = 0 + data Hemmo = Hemmo {hemmo_sijainti :: Point} --- päivitäHemmoa :: Point -> Hemmo -> Hemmo --- päivitäHemmoa kopteri hemmo --- | liikkuu = hemmo {hemmo_sijainti = hemmo_sijainti hemmo #+ (suunta,0)} --- where --- liikkuu = magV (kopteri #- hemmo_sijainti hemmo) > 600 --- suunta --- | fst kopteri < fst (hemmo_sijainti hemmo) --- = -2 --- | otherwise = 2 --- in if liikkuu +haluaakoLiikkua :: Choplifter -> Hemmo -> Bool +haluaakoLiikkua peli hemmo = haluaaLiikkua && not putoaako + where + kopterinPaikka = cl_paikka peli + + putoaako = abs (korkeusEdessä - snd (hemmo_sijainti hemmo)) > 50 + korkeusEdessä = korkeusKohdassa (fst (hemmo_sijainti hemmo) + suunta * 2) + peli + + haluaaLiikkua = magV (kopterinPaikka #- hemmo_sijainti hemmo) < 600 + suunta = minneHemmoMenisi peli hemmo + +minneHemmoMenisi :: Choplifter -> Hemmo -> Float +minneHemmoMenisi peli hemmo + | fst kopterinPaikka < fst (hemmo_sijainti hemmo) + = -1 + | otherwise + = 1 + where + kopterinPaikka = cl_paikka peli + +päivitäHemmoa :: Choplifter -> Hemmo -> Hemmo +päivitäHemmoa peli hemmo + | haluaakoLiikkua peli hemmo + = hemmo{hemmo_sijainti = hemmo_sijainti hemmo #+ (suunta,0)} + | otherwise + = hemmo + where + suunta = minneHemmoMenisi peli hemmo piirräHemmo :: Float -> Hemmo -> Picture piirräHemmo aika hemmo = let