From a1a3dbadffaaab290a6b6bb4b61df787d3b8ffdd Mon Sep 17 00:00:00 2001 From: Joris Guyonvarch Date: Fri, 3 Oct 2014 16:18:24 +0200 Subject: Adding a target to catch --- index.html | 5 ++--- src/Display.elm | 45 +++++++++++++++++++++++++++------------------ src/Enemy.elm | 2 +- src/EnemyState.elm | 10 +++++----- src/Game.elm | 26 +++++++++++++++----------- src/Input.elm | 6 ++++-- src/Main.elm | 2 +- src/RandomValues.elm | 2 ++ src/Step.elm | 32 ++++++++++++++++++++++++-------- src/Target.elm | 24 ++++++++++++++++++++++++ src/genGame | 1 - src/generate | 1 + style.css | 2 +- 13 files changed, 107 insertions(+), 51 deletions(-) create mode 100644 src/Target.elm delete mode 100755 src/genGame create mode 100755 src/generate diff --git a/index.html b/index.html index cbf37b4..b2352f0 100644 --- a/index.html +++ b/index.html @@ -17,10 +17,9 @@
diff --git a/src/Display.elm b/src/Display.elm index cb9fb86..b586129 100644 --- a/src/Display.elm +++ b/src/Display.elm @@ -5,22 +5,24 @@ import Player (..) import Game (Game) import Enemy (..) import Board (boardSize) +import Target (..) display : Game -> Element -display {time, player, enemyState, bestTime} = +display {time, player, target, enemyState, bestScore} = let enemyForms = map (enemyForm time) enemyState.enemies forms = boardForms ++ playerForms player + ++ targetForms target.pos ++ enemyForms - ++ bestTimeForms bestTime - ++ timeForms time + ++ scoreForms target.score + ++ bestScoreForms bestScore in collage (truncate boardSize.x) (truncate boardSize.y) forms boardForms : [Form] boardForms = [filled boardColor (rect boardSize.x boardSize.y)] boardColor : Color -boardColor = rgb 34 122 34 +boardColor = rgb 17 17 17 playerForms : Player -> [Form] playerForms player = [circleForm player.pos playerSize playerColor] @@ -28,6 +30,12 @@ playerForms player = [circleForm player.pos playerSize playerColor] playerColor : Color playerColor = rgb 224 224 224 +targetForms : Vec2 -> [Form] +targetForms pos = [circleForm pos targetSize targetColor] + +targetColor : Color +targetColor = rgb 34 85 34 + enemyForm : Float -> Enemy -> Form enemyForm time enemy = let pos = enemyMove enemy time @@ -39,17 +47,25 @@ enemyColor = rgb 170 0 0 circleForm : Vec2 -> Float -> Color -> Form circleForm pos size color = let outline = circle size - |> filled black - inside = circle (size - 2) + |> filled outlineColor + inside = circle (size - 1) |> filled color in group [outline, inside] |> move (pos.x, pos.y) -bestTimeForms : Float -> [Form] -bestTimeForms bestTime = - if(bestTime > 0) then - let seconds = truncate (bestTime / 1000) - text = "Record: " ++ (show seconds) +outlineColor : Color +outlineColor = rgb 34 34 34 + +scoreForms : Int -> [Form] +scoreForms score = + let text = (show score) + scorePos = { x = 0.0, y = boardSize.y / 2 - 30 } + in [textForm text scorePos centered] + +bestScoreForms : Int -> [Form] +bestScoreForms bestScore = + if(bestScore > 0) then + let text = "Record: " ++ (show bestScore) pos = { x = boardSize.x / 2 - 65 , y = -boardSize.y / 2 + 30 @@ -57,13 +73,6 @@ bestTimeForms bestTime = in [textForm text pos rightAligned] else [] -timeForms : Float -> [Form] -timeForms time = - let seconds = truncate (time / 1000) - text = (show seconds) - pos = { x = 0.0, y = boardSize.y / 2 - 30 } - in [textForm text pos centered] - textForm : String -> Vec2 -> (Text -> Element) -> Form textForm content pos alignment = let textElement = toText content diff --git a/src/Enemy.elm b/src/Enemy.elm index 2c80f0a..0f986aa 100644 --- a/src/Enemy.elm +++ b/src/Enemy.elm @@ -15,7 +15,7 @@ enemyMove enemy time = enemy.move enemy.initTime enemy.initPos enemy.initDest time enemySize : Float -enemySize = 8 +enemySize = 5 enemySpeed : Float -> Float enemySpeed dt = dt / 25 diff --git a/src/EnemyState.elm b/src/EnemyState.elm index 81766bf..fed2981 100644 --- a/src/EnemyState.elm +++ b/src/EnemyState.elm @@ -18,12 +18,12 @@ initEnemyState = , lastSpawn = -spawn } -playerEnemyCollision : Float -> Player -> Enemy -> Bool -playerEnemyCollision time player enemy = - let enemyPos = enemyMove enemy time - in (distance enemyPos player.pos) < enemySize + playerSize - playerEnemiesCollision : Float -> Player -> [Enemy] -> Bool playerEnemiesCollision time player enemies = let collision = playerEnemyCollision time player in length (filter collision enemies) > 0 + +playerEnemyCollision : Float -> Player -> Enemy -> Bool +playerEnemyCollision time player enemy = + let enemyPos = enemyMove enemy time + in (distance enemyPos player.pos) < enemySize + playerSize diff --git a/src/Game.elm b/src/Game.elm index c86af26..8de0c40 100644 --- a/src/Game.elm +++ b/src/Game.elm @@ -3,23 +3,27 @@ module Game where import Player (..) import Enemy (..) import EnemyState (..) +import Target(..) import Vec2 (Vec2) type Game = { time : Float , player : Player + , target : Target , enemyState : EnemyState - , bestTime : Float + , bestScore : Int } -initialGame : Vec2 -> Float -> Game -initialGame playerPos bestTime = +initialGame : Vec2 -> Int -> Game +initialGame playerPos bestScore = let initPlayer = - { pos = playerPos - , speed = { x = 0, y = 0 } - } - in { time = 0 - , player = initPlayer - , enemyState = initEnemyState - , bestTime = bestTime - } + { pos = playerPos + , speed = { x = 0, y = 0 } + } + in + { time = 0 + , player = initPlayer + , target = initTarget + , enemyState = initEnemyState + , bestScore = bestScore + } diff --git a/src/Input.elm b/src/Input.elm index d8614b0..69e7503 100644 --- a/src/Input.elm +++ b/src/Input.elm @@ -16,7 +16,7 @@ getInput : Signal Input getInput = let dtSignal = delta dirSignal = lift recordIntToVec2 Keyboard.arrows - randomFloatsSignal = Random.floatList (lift (\_ -> 3) dtSignal) + randomFloatsSignal = Random.floatList (lift (\_ -> 5) dtSignal) randomValuesSignal = lift floatsToRandomValues randomFloatsSignal in sampleOn dtSignal <| Input <~ dirSignal ~ dtSignal @@ -32,8 +32,10 @@ recordIntToVec2 {x, y} = } floatsToRandomValues : [Float] -> RandomValues -floatsToRandomValues [enemyAngle, enemyX, enemyY] = +floatsToRandomValues [enemyAngle, enemyX, enemyY, targetX, targetY] = { enemyAngle = enemyAngle , enemyX = enemyX , enemyY = enemyY + , targetX = targetX + , targetY = targetY } diff --git a/src/Main.elm b/src/Main.elm index 267bb8c..c51ddc8 100644 --- a/src/Main.elm +++ b/src/Main.elm @@ -7,4 +7,4 @@ import Input (getInput) import Vec2 (originVec) main : Signal Element -main = lift display (foldp step (initialGame originVec 0) getInput) +main = lift display (foldp step (initialGame { x = -50, y = 0 } 0) getInput) diff --git a/src/RandomValues.elm b/src/RandomValues.elm index 4638037..3d389f3 100644 --- a/src/RandomValues.elm +++ b/src/RandomValues.elm @@ -4,4 +4,6 @@ type RandomValues = { enemyAngle : Float , enemyX : Float , enemyY : Float + , targetX : Float + , targetY : Float } diff --git a/src/Step.elm b/src/Step.elm index 7894e45..b88740a 100644 --- a/src/Step.elm +++ b/src/Step.elm @@ -11,20 +11,23 @@ import Physics (getNewPosAndSpeed, getMove) import Board (boardSize, boardDiagonal) import Geometry (..) import RandomValues (RandomValues) +import Target(..) step : Input -> Game -> Game -step {dir, delta, randomValues} {time, player, enemyState, bestTime} = +step {dir, delta, randomValues} {time, player, target, enemyState, bestScore} = if(playerEnemiesCollision time player enemyState.enemies) then - let newBestTime = if(time > bestTime) then time else bestTime - in initialGame player.pos newBestTime + let newBestScore = if(target.score > bestScore) then target.score else bestScore + in initialGame player.pos newBestScore else let newTime = time + delta newPlayer = playerStep delta dir player + newTarget = targetStep player randomValues target newEnemyState = enemyStep time randomValues enemyState in { time = newTime , player = newPlayer + , target = newTarget , enemyState = newEnemyState - , bestTime = bestTime + , bestScore = bestScore } playerStep : Float -> Vec2 -> Player -> Player @@ -34,6 +37,15 @@ playerStep dt dir player = , speed = speed } +targetStep : Player -> RandomValues -> Target -> Target +targetStep player randomValues target = + if(targetCollision player target) then + { score = target.score + 1 + , pos = randomBoardPosition (randomValues.targetX, randomValues.targetY) (0.8, 0.8) + } + else + target + enemyStep : Float -> RandomValues -> EnemyState -> EnemyState enemyStep time randomValues {enemies, spawn, lastSpawn} = let isPresent enemy = (distance (enemyMove enemy time) originVec) < enemyAwayDist @@ -65,8 +77,12 @@ enemyInitPos randomValues = enemyDestination : RandomValues -> Vec2 enemyDestination randomValues = - let destWidth = boardSize.x - destHeight = boardSize.y - in { x = destWidth * randomValues.enemyX - destWidth / 2 - , y = destHeight * randomValues.enemyY - destHeight / 2 + randomBoardPosition (randomValues.enemyX, randomValues.enemyY) (1, 1) + +randomBoardPosition : (Float, Float) -> (Float, Float) -> Vec2 +randomBoardPosition (randomX, randomY) (percentX, percentY) = + let width = boardSize.x * percentX + height = boardSize.y * percentY + in { x = width * randomX - width / 2 + , y = height * randomY - height / 2 } diff --git a/src/Target.elm b/src/Target.elm new file mode 100644 index 0000000..92ab4c2 --- /dev/null +++ b/src/Target.elm @@ -0,0 +1,24 @@ +module Target where + +import Board (boardSize) +import Geometry (distance) +import Vec2 (Vec2) +import Player (..) + +type Target = + { score : Int + , pos : Vec2 + } + +targetSize : Float +targetSize = 20 + +targetCollision : Player -> Target -> Bool +targetCollision player target = + (distance player.pos target.pos) < playerSize + targetSize + +initTarget : Target +initTarget = + { score = 0 + , pos = { x = 50, y = 0 } + } diff --git a/src/genGame b/src/genGame deleted file mode 100755 index 0b71849..0000000 --- a/src/genGame +++ /dev/null @@ -1 +0,0 @@ -elm --make --only-js Main.elm diff --git a/src/generate b/src/generate new file mode 100755 index 0000000..0b71849 --- /dev/null +++ b/src/generate @@ -0,0 +1 @@ +elm --make --only-js Main.elm diff --git a/style.css b/style.css index ba99e1e..71a4afc 100644 --- a/style.css +++ b/style.css @@ -8,7 +8,7 @@ h1 { font-weight: bold; background-color: #225522; min-width: 500px; - color: #e0e0e0; + color: white; margin: 0; padding-top: 20px; padding-bottom: 20px; -- cgit v1.2.3