1

deWitter のゲームループに基づいてゲーム ループを作成しました。

ただし、それをより機能的な状態に移行する方法がわかりません。コード内に変更可能な状態を残す必要があるかもしれないことは理解していますが、余分なdefs をクリーンアップするための一般的な原則はありますか?

(ns beepboop.core)

(def ticks-per-second 25)
(def skip-ticks (/ 1000 ticks-per-second))
(def max-frameskip 5)

(defn update []
  (println "Updating."))

(defn display [delta]
  (println "Displaying with delta: " delta))

(defn -main []
  (def *next-tick* (System/currentTimeMillis))
  (while true
    (def *loops* 0)
    (while (and
            (> (System/currentTimeMillis)
               *next-tick*)
            (< *loops*
               max-frameskip))
      (update)
      (def *next-tick* (+ *next-tick* skip-ticks))
      (def *loops* (+ *loops* 1)))
    (display
     (/ (+ (System/currentTimeMillis) skip-ticks (* -1 *next-tick*))
        skip-ticks))))
4

1 に答える 1

3

ループ変数の更新にはloopとを使用する必要があります。recur

(defn -main []
  (loop [next-tick (System/currentTimeMillis)]
    (let [next-next 
          (loop [next-tick next-tick
                 loops 0]
            (if (and (> (System/currentTimeMillis) next-tick)
                     (< loops max-frameskip))
                (do (update)
                    (recur (+ next-tick skip-ticks) (+ loops 1)))
                next-tick))]
      (display (/ (+ (System/currentTimeMillis) skip-ticks (- next-next))
                  skip-ticks))
      (recur next-next))))
于 2013-03-31T05:03:38.263 に答える