Start UI code and allow multiple screens to be displayed

This commit is contained in:
oakes
2014-01-05 20:52:53 -05:00
parent 0567451679
commit 8e0fdc8ed4
3 changed files with 76 additions and 29 deletions

View File

@@ -3,7 +3,8 @@
(:import [com.badlogic.gdx Game Gdx Input$Keys Screen]
[com.badlogic.gdx.graphics Camera Color GL20 OrthographicCamera
PerspectiveCamera Texture]
[com.badlogic.gdx.graphics.g2d Animation SpriteBatch TextureRegion]
[com.badlogic.gdx.graphics.g2d Animation BitmapFont SpriteBatch
TextureRegion]
[com.badlogic.gdx.maps MapLayer MapLayers]
[com.badlogic.gdx.maps.tiled TiledMap TiledMapTileLayer TmxMapLoader]
[com.badlogic.gdx.maps.tiled.renderers
@@ -12,11 +13,13 @@
IsometricStaggeredTiledMapRenderer
IsometricTiledMapRenderer
OrthogonalTiledMapRenderer]
[com.badlogic.gdx.scenes.scene2d Actor Stage]))
[com.badlogic.gdx.scenes.scene2d Actor Stage]
[com.badlogic.gdx.scenes.scene2d.ui Label Label$LabelStyle]))
(load "core_2d")
(load "core_global")
(load "core_render")
(load "core_ui")
(defn- dummy [& args])
@@ -34,24 +37,24 @@
(reset! entities)))
create-renderer-fn! #(swap! screen assoc :renderer (renderer %))
create-camera-fn! #(swap! screen assoc :camera (camera %))]
(proxy [Screen] []
(show []
(->> (swap! screen assoc
:total-time 0
:delta-time 0
:create-renderer create-renderer-fn!
:create-camera create-camera-fn!)
(execute-fn! on-show)))
(render [delta-time]
(->> (swap! screen (fn [val]
(assoc val
:total-time (+ (:total-time val) delta-time)
:delta-time delta-time)))
(execute-fn! on-render)))
(hide [] (execute-fn! on-hide @screen))
(pause [] (execute-fn! on-pause @screen))
(resize [w h] (execute-fn! on-resize @screen))
(resume [] (execute-fn! on-resume @screen)))))
{:show (fn []
(->> (swap! screen assoc
:total-time 0
:delta-time 0
:create-renderer create-renderer-fn!
:create-camera create-camera-fn!)
(execute-fn! on-show)))
:render (fn [delta-time]
(->> (fn [val]
(assoc val
:total-time (+ (:total-time val) delta-time)
:delta-time delta-time))
(swap! screen)
(execute-fn! on-render)))
:hide #(execute-fn! on-hide @screen)
:pause #(execute-fn! on-pause @screen)
:resize #(execute-fn! on-resize @screen)
:resume #(execute-fn! on-resume @screen)}))
(defmacro defscreen
[n & {:keys [] :as options}]
@@ -72,8 +75,17 @@
`(defonce ~name (defgame* ~options)))
(defn set-screen!
[^Game game ^Screen screen]
(.setScreen game screen))
[^Game game & screens]
(let [run-fn! (fn [key & args]
(doseq [screen screens]
(apply (get screen key) args)))]
(.setScreen game (proxy [Screen] []
(show [] (run-fn! :show))
(render [delta-time] (run-fn! :render delta-time))
(hide [] (run-fn! :hide))
(pause [] (run-fn! :pause))
(resize [w h] (run-fn! :resize))
(resume [] (run-fn! :resume))))))
(defn create-renderer!
[{:keys [create-renderer]} & {:keys [] :as args}]

View File

@@ -16,17 +16,37 @@
[{:keys [^Stage renderer]}]
(.getSpriteBatch renderer))
(defn draw-actor!
[^SpriteBatch batch {:keys [^Actor actor] :as entity}]
(doseq [[k v] entity]
(case k
:x (.setX actor v)
:y (.setY actor v)
:width (.setWidth actor v)
:height (.setHeight actor v)
nil))
(.draw ^Actor actor batch 1))
(defn draw-image!
[^SpriteBatch batch {:keys [^TextureRegion image x y width height]}]
(.draw batch image (float x) (float y) (float width) (float height)))
(defn draw-entity!
[^SpriteBatch batch entity]
(cond
(:actor entity)
(draw-actor! batch entity)
(:image entity)
(draw-image! batch entity)
(isa? (type entity) Actor)
(draw-actor! batch {:actor entity})))
(defn draw! [{:keys [renderer] :as screen} entities]
(assert renderer)
(let [^SpriteBatch batch (sprite-batch screen)]
(.begin batch)
(doseq [e entities]
(cond
(map? e)
(let [{:keys [^TextureRegion image x y width height]} e]
(.draw batch image (float x) (float y) (float width) (float height)))
(isa? (type e) Actor)
(.draw ^Actor e batch 1)))
(doseq [entity entities]
(draw-entity! batch entity))
(.end batch))
entities)

15
src/play_clj/core_ui.clj Normal file
View File

@@ -0,0 +1,15 @@
(in-ns 'play-clj.core)
(defmacro color
[& args]
`~(if (keyword? (first args))
`(Color. ^Color (utils/gdx-static-field :graphics :Color ~(first args)))
`(Color. ~@args)))
(defn create-actor
[actor]
{:actor actor :x 0 :y 0})
(defn label
[text color]
(create-actor (Label. text (Label$LabelStyle. (BitmapFont.) color))))