Unity 勉強メモ

ゲームエンジンのUnityを勉強するブログです。

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らしいプログラムに仕上がっていると思う。