Elmを使ってみた時のメモ (その2)
ウインドウ内をボールが飛び跳ねるプログラム (改良版)
import Graphics.Element(..) import Graphics.Collage(..) import Color(..) import Signal(..) import Time(..) import Window(..) type alias State = { x : Float, y : Float, vx : Float, vy : Float, w : Int, h : Int } main : Signal Element main = draw <~ foldp update init tick tick : Signal ((Int, Int), Time) tick = (,) <~ dimensions ~ fps 30 init : State init = { x = 0, y = 0, vx = 5, vy = 5, w = 0, h = 0 } draw : State -> Element draw st = collage st.w st.h [ move (st.x, st.y) (filled blue (circle 10)) ] update : ((Int, Int), Time) -> State -> State update ((w, h), _) st = let new_x = st.x + st.vx new_y = st.y + st.vy in { x = new_x, y = new_y, vx = new_v st.x st.vx w, vy = new_v st.y st.vy h, w = w, h = h } new_v : Float -> Float -> Int -> Float new_v x vx w = if | x > toFloat w / 2 -> -(abs vx) | x < -(toFloat w / 2) -> abs vx | otherwise -> vx
前回の記事ではdelay
を使って二つのSignalをマージしていたが、
よく考えるとこれは不要であることに気付いた。
今回のバージョンは、よりすっきりとしたElmらしいプログラムに仕上がっていると思う。