Add input functions to defscreen

This commit is contained in:
oakes
2014-01-10 12:51:30 -05:00
parent e60a6f360a
commit 85dff89682
3 changed files with 54 additions and 35 deletions

View File

@@ -41,7 +41,8 @@
(defn defscreen* (defn defscreen*
[{:keys [on-show on-render on-hide on-pause on-resize on-resume] [{:keys [on-show on-render on-hide on-pause on-resize on-resume]
:or {on-show dummy on-render dummy on-hide dummy :or {on-show dummy on-render dummy on-hide dummy
on-pause dummy on-resize dummy on-resume dummy}}] on-pause dummy on-resize dummy on-resume dummy}
:as options}]
(let [screen (atom {}) (let [screen (atom {})
entities (atom '()) entities (atom '())
execute-fn! (fn [func screen-map] execute-fn! (fn [func screen-map]
@@ -51,6 +52,12 @@
flatten flatten
(remove nil?) (remove nil?)
(compare-and-set! entities entities-list)))) (compare-and-set! entities entities-list))))
execute-priority-fn! (fn [func options]
(some->> (func (merge @screen options) @entities)
list
flatten
(remove nil?)
(reset! entities)))
create-renderer-fn! #(swap! screen assoc :renderer (renderer %)) create-renderer-fn! #(swap! screen assoc :renderer (renderer %))
update-fn! #(swap! screen merge %)] update-fn! #(swap! screen merge %)]
{:screen screen {:screen screen
@@ -72,7 +79,8 @@
:hide #(execute-fn! on-hide @screen) :hide #(execute-fn! on-hide @screen)
:pause #(execute-fn! on-pause @screen) :pause #(execute-fn! on-pause @screen)
:resize #(execute-fn! on-resize @screen) :resize #(execute-fn! on-resize @screen)
:resume #(execute-fn! on-resume @screen)})) :resume #(execute-fn! on-resume @screen)
:input (input* options execute-priority-fn!)}))
(defmacro defscreen (defmacro defscreen
[n & {:keys [] :as options}] [n & {:keys [] :as options}]
@@ -85,7 +93,9 @@
(defn defgame* (defn defgame*
[{:keys [on-create] :or {on-create dummy}}] [{:keys [on-create] :or {on-create dummy}}]
(proxy [Game] [] (proxy [Game] []
(create [] (on-create this)))) (create []
(set-input! (InputMultiplexer.))
(on-create this))))
(defmacro defgame (defmacro defgame
[n & {:keys [] :as options}] [n & {:keys [] :as options}]
@@ -93,11 +103,14 @@
(defn set-screen! (defn set-screen!
[^Game game & screens] [^Game game & screens]
(let [run-fn! (fn [k & args] (let [add-inputs! (fn []
(doseq [screen screens]
(add-input! (:input screen))))
run-fn! (fn [k & args]
(doseq [screen screens] (doseq [screen screens]
(apply (get screen k) args)))] (apply (get screen k) args)))]
(.setScreen game (reify Screen (.setScreen game (reify Screen
(show [this] (run-fn! :show)) (show [this] (add-inputs!) (run-fn! :show))
(render [this delta-time] (run-fn! :render delta-time)) (render [this delta-time] (run-fn! :render delta-time))
(hide [this] (run-fn! :hide)) (hide [this] (run-fn! :hide))
(pause [this] (run-fn! :pause)) (pause [this] (run-fn! :pause))

View File

@@ -43,34 +43,44 @@
[key] [key]
`(.isKeyPressed ^Input (Gdx/input) (get-keycode ~key))) `(.isKeyPressed ^Input (Gdx/input) (get-keycode ~key)))
(defn input (defn input*
[& {:keys [key-down key-typed key-up mouse-moved [{:keys [key-down key-typed key-up mouse-moved
scrolled touch-down touch-dragged touch-up] scrolled touch-down touch-dragged touch-up]
:or {key-down dummy key-typed dummy key-up dummy mouse-moved dummy :or {key-down dummy key-typed dummy key-up dummy mouse-moved dummy
scrolled dummy touch-down dummy touch-dragged dummy touch-up dummy}}] scrolled dummy touch-down dummy touch-dragged dummy touch-up dummy}}
(let [return-fn (fn [return-val] execute-fn!]
(some #(not (nil? %)) [return-val false]))] (reify InputProcessor
(reify InputProcessor (keyDown [this keycode]
(keyDown [this keycode] (execute-fn! key-down {:keycode keycode})
(return-fn (key-down keycode))) false)
(keyTyped [this character] (keyTyped [this character]
(return-fn (key-typed character))) (execute-fn! key-typed {:character character})
(keyUp [this keycode] false)
(return-fn (key-up keycode))) (keyUp [this keycode]
(mouseMoved [this screen-x screen-y] (execute-fn! key-up {:keycode keycode})
(return-fn (mouse-moved screen-x screen-y))) false)
(scrolled [this amount] (mouseMoved [this screen-x screen-y]
(return-fn (scrolled amount))) (execute-fn! mouse-moved {:screen-x screen-x :screen-y screen-y})
(touchDown [this screen-x screen-y pointer button] false)
(return-fn (touch-down screen-x screen-y pointer button))) (scrolled [this amount]
(touchDragged [this screen-x screen-y pointer] (execute-fn! scrolled {:amount amount})
(return-fn (touch-dragged screen-x screen-y pointer))) false)
(touchUp [this screen-x screen-y pointer button] (touchDown [this screen-x screen-y pointer button]
(return-fn (touch-up screen-x screen-y pointer button)))))) (execute-fn! touch-down {:screen-x screen-x :screen-y screen-y
:pointer pointer :button button})
false)
(touchDragged [this screen-x screen-y pointer]
(execute-fn! touch-dragged
{:screen-x screen-x :screen-y screen-y :pointer pointer})
false)
(touchUp [this screen-x screen-y pointer button]
(execute-fn! touch-up {:screen-x screen-x :screen-y screen-y
:pointer pointer :button button})
false)))
(defmacro input-multi (defmacro input
[& args] [& args]
`(InputMultiplexer. ~@args)) `(input* ~args (fn [func# options#] (func# options#))))
(defn set-input! (defn set-input!
[^InputProcessor p] [^InputProcessor p]

View File

@@ -62,10 +62,6 @@
[k & options] [k & options]
`(utils/call! ^Input (Gdx/input) ~k ~@options)) `(utils/call! ^Input (Gdx/input) ~k ~@options))
(defmacro input-multi!
[obj k & options]
`(utils/call! ^InputMultiplexer ~obj ~k ~@options))
(defmacro net! (defmacro net!
[k & options] [k & options]
`(utils/call! ^Net (Gdx/net) ~k ~@options)) `(utils/call! ^Net (Gdx/net) ~k ~@options))