diff options
author | Guillermo Ramos | 2014-08-04 23:03:09 +0200 |
---|---|---|
committer | Guillermo Ramos | 2014-08-04 23:03:23 +0200 |
commit | 66de074e1292a6922bbc0c9804da6d0a6024c32c (patch) | |
tree | 38e1abb0d746c5646a96876c4c9a5a24aa1f4994 | |
parent | 1a9455a1624e554c89ba846b44b1f703e44a6fc8 (diff) | |
download | 7l-66de074e1292a6922bbc0c9804da6d0a6024c32c.tar.gz |
-rw-r--r-- | elm/img/bruce.gif | bin | 0 -> 3128 bytes | |||
-rw-r--r-- | elm/img/brucetate.png | bin | 0 -> 10616 bytes | |||
-rw-r--r-- | elm/img/dave.gif | bin | 0 -> 3123 bytes | |||
-rw-r--r-- | elm/img/davethomas.png | bin | 0 -> 14938 bytes | |||
-rw-r--r-- | elm/img/evanczaplicki.png | bin | 0 -> 14462 bytes | |||
-rw-r--r-- | elm/img/joe.gif | bin | 0 -> 6355 bytes | |||
-rw-r--r-- | elm/img/joearmstrong.png | bin | 0 -> 15179 bytes | |||
-rw-r--r-- | elm/img/jose.gif | bin | 0 -> 3170 bytes | |||
-rw-r--r-- | elm/img/josevalim.png | bin | 0 -> 11352 bytes | |||
-rw-r--r-- | elm/languageHeads.elm | 119 |
10 files changed, 119 insertions, 0 deletions
diff --git a/elm/img/bruce.gif b/elm/img/bruce.gif Binary files differnew file mode 100644 index 0000000..9a286ba --- /dev/null +++ b/elm/img/bruce.gif diff --git a/elm/img/brucetate.png b/elm/img/brucetate.png Binary files differnew file mode 100644 index 0000000..0734e88 --- /dev/null +++ b/elm/img/brucetate.png diff --git a/elm/img/dave.gif b/elm/img/dave.gif Binary files differnew file mode 100644 index 0000000..5a96c9c --- /dev/null +++ b/elm/img/dave.gif diff --git a/elm/img/davethomas.png b/elm/img/davethomas.png Binary files differnew file mode 100644 index 0000000..04da5b6 --- /dev/null +++ b/elm/img/davethomas.png diff --git a/elm/img/evanczaplicki.png b/elm/img/evanczaplicki.png Binary files differnew file mode 100644 index 0000000..552de97 --- /dev/null +++ b/elm/img/evanczaplicki.png diff --git a/elm/img/joe.gif b/elm/img/joe.gif Binary files differnew file mode 100644 index 0000000..b5631b9 --- /dev/null +++ b/elm/img/joe.gif diff --git a/elm/img/joearmstrong.png b/elm/img/joearmstrong.png Binary files differnew file mode 100644 index 0000000..af82613 --- /dev/null +++ b/elm/img/joearmstrong.png diff --git a/elm/img/jose.gif b/elm/img/jose.gif Binary files differnew file mode 100644 index 0000000..823ce6c --- /dev/null +++ b/elm/img/jose.gif diff --git a/elm/img/josevalim.png b/elm/img/josevalim.png Binary files differnew file mode 100644 index 0000000..a914392 --- /dev/null +++ b/elm/img/josevalim.png diff --git a/elm/languageHeads.elm b/elm/languageHeads.elm new file mode 100644 index 0000000..4256f15 --- /dev/null +++ b/elm/languageHeads.elm @@ -0,0 +1,119 @@ +module LanguageHeads where + +import Keyboard +import Mouse +import Random + + +data State = Play | Pause | GameOver + +type Input = { space : Bool , x : Int + , delta : Time , rand : Int } +type Head = { x : Float, y : Float, vx : Float, vy : Float, img : String } +type Player = { x : Float, score : Int } +type Game = { state : State, heads : [Head], player : Player } + +defaultHead : Int -> Head +defaultHead n = { x = 100, y = 75, vx = 60, vy = 0, img = headImage n } + +defaultGame : Game +defaultGame = { state = Pause, heads = [], player = { x = 0, score = 0 } } + +headImage : Int -> String +headImage n = + if | n == 0 -> "img/brucetate.png" + | n == 1 -> "img/davethomas.png" + | n == 2 -> "img/evanczaplicki.png" + | n == 3 -> "img/joearmstrong.png" + | n == 4 -> "img/josevalim.png" + | otherwise -> "" + +bottom = 550 + +secsPerFrame = 1 / 50 +delta = inSeconds <~ fps 50 + +input = sampleOn delta (Input <~ Keyboard.space + ~ Mouse.x + ~ delta + ~ Random.range 0 4 (every secsPerFrame)) + +main = lift display gameState + +gameState = foldp stepGame defaultGame input + +stepGame input game = + case game.state of + Play -> stepGamePlay input game + Pause -> stepGamePaused input game + GameOver -> stepGameFinished input game + +stepGamePlay { space, x, delta, rand } ({ state, heads, player } as game) = + { game | state <- stepGameOver x heads + , heads <- stepHeads heads delta x player.score rand + , player <- stepPlayer player x heads } +stepGameOver x heads = + if all (headSafe (toFloat x)) heads then Play else GameOver +headSafe x head = head.y < bottom || abs (head.x - x) < 50 +stepHeads heads delta x score rand = + spawnHead score heads rand + |> map bounce + |> removeComplete + |> map moveHead +spawnHead score heads rand = + let addHead = length heads < (score `div` 5000+1) + && all (\h -> h.x > 107.0) heads in + if addHead then defaultHead rand :: heads else heads +bounce head = { head | vy <- if head.y > bottom && head.vy > 0 + then -head.vy * 0.95 + else head.vy } +removeComplete = filter (not . complete) +complete {x} = x > 750 +moveHead ({x, y, vx, vy} as head) = + { head | x <- x + vx * secsPerFrame + , y <- y + vy * secsPerFrame + , vy <- vy + secsPerFrame * 400 } + +stepPlayer player mouseX heads = + { player | score <- stepScore player heads + , x <- toFloat mouseX } +stepScore player heads = player.score + 1 + + 1000 * (length (filter complete heads)) + +stepGamePaused {space, x, delta} ({state, heads, player} as game) = + { game | state <- stepState space state + , player <- { player | x <- toFloat x } } +stepState space state = if space then Play else state +stepGameFinished {space, x, delta} ({state, heads, player} as game) = + if space then defaultGame + else { game | state <- GameOver + , player <- { player | x <- toFloat x } } + +display ({state, heads, player} as game) = + let (w, h) = (800, 600) + in collage w h ([ drawRoad w h + , drawBuilding w h + , drawPaddle w h player.x + , drawScore w h player + , drawMessage w h state] ++ + (map (drawHead w h) heads)) + +drawRoad w h = filled gray (rect (toFloat w) 100) |> moveY (-(half h) + 50) +drawBuilding w h = filled red (rect 100 (toFloat h)) |> moveX (-(half w) + 50) +drawHead w h head = let x = half w - head.x + y = half h - head.y + src = head.img + in toForm (image 75 75 src) + |> move (-x, y) + |> rotate (degrees (x*2 - 100)) +drawPaddle w h x = filled black (rect 80 10) + |> moveX (x + 10 - half w) + |> moveY (-(half h - 30)) +half x = toFloat x / 2 +drawScore w h player = toForm (fullScore player) + |> move (half w - 150, half h - 40) +fullScore player = txt (Text.height 50) (show player.score) +txt f = asText . f . monospace . Text.color blue . toText +drawMessage w h state = toForm (txt (Text.height 50) (stateMessage state)) + |> move (50, 50) +stateMessage state = if state == GameOver then "Game Over" else "Language Heads"
\ No newline at end of file |