diff --git a/src/play_clj/core.clj b/src/play_clj/core.clj index b278f66..82b80e5 100644 --- a/src/play_clj/core.clj +++ b/src/play_clj/core.clj @@ -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}] diff --git a/src/play_clj/core_2d.clj b/src/play_clj/core_2d.clj index 948ef62..9d929eb 100644 --- a/src/play_clj/core_2d.clj +++ b/src/play_clj/core_2d.clj @@ -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) diff --git a/src/play_clj/core_ui.clj b/src/play_clj/core_ui.clj new file mode 100644 index 0000000..3338964 --- /dev/null +++ b/src/play_clj/core_ui.clj @@ -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))))