From b703780089969df792cff41b8dc19e2e993008d1 Mon Sep 17 00:00:00 2001 From: oakes Date: Fri, 17 Jan 2014 18:11:37 -0500 Subject: [PATCH] Improve body functions and allow graphics macros to work on both the screen and the objects themselves --- src/play_clj/core_global.clj | 14 ++++---- src/play_clj/core_graphics.clj | 20 +++++++----- src/play_clj/g2d_physics.clj | 60 +++++++++++++++++++++------------- src/play_clj/ui.clj | 4 +-- src/play_clj/utils.clj | 14 +++++--- 5 files changed, 69 insertions(+), 43 deletions(-) diff --git a/src/play_clj/core_global.clj b/src/play_clj/core_global.clj index da38d52..c409003 100644 --- a/src/play_clj/core_global.clj +++ b/src/play_clj/core_global.clj @@ -49,8 +49,8 @@ ; input/output (defn game - [key] - (case key + [k] + (case k :width (graphics! :get-width) :height (graphics! :get-height) :fps (graphics! :get-frames-per-second) @@ -58,15 +58,15 @@ :is-touched? (input! :is-touched) :x (input! :get-x) :y (input! :get-y) - nil)) + (u/throw-key-not-found k))) (defmacro key-code - [key] - `~(symbol (str u/main-package ".Input$Keys/" (u/key->upper key)))) + [k] + `~(symbol (str u/main-package ".Input$Keys/" (u/key->upper k)))) (defmacro is-pressed? - [key] - `(input! :is-key-pressed (key-code ~key))) + [k] + `(input! :is-key-pressed (key-code ~k))) (defn ^:private input-processor [{:keys [on-key-down on-key-typed on-key-up on-mouse-moved diff --git a/src/play_clj/core_graphics.clj b/src/play_clj/core_graphics.clj index 2ab3bf9..5b5827c 100644 --- a/src/play_clj/core_graphics.clj +++ b/src/play_clj/core_graphics.clj @@ -86,7 +86,8 @@ (defmacro orthogonal-tiled-map! [screen k & options] - `(u/call! ^OrthogonalTiledMapRenderer (:renderer ~screen) ~k ~@options)) + `(u/call! ^OrthogonalTiledMapRenderer (or (:renderer ~screen) ~screen) + ~k ~@options)) (defn isometric-tiled-map* [path unit] @@ -99,11 +100,13 @@ (defmacro isometric-tiled-map! [screen k & options] - `(u/call! ^IsometricTiledMapRenderer (:renderer ~screen) ~k ~@options)) + `(u/call! ^IsometricTiledMapRenderer (or (:renderer ~screen) ~screen) + ~k ~@options)) (defn isometric-staggered-tiled-map* [path unit] - (IsometricStaggeredTiledMapRenderer. ^TiledMap (tiled-map* path) ^double unit)) + (IsometricStaggeredTiledMapRenderer. ^TiledMap (tiled-map* path) + ^double unit)) (defmacro isometric-staggered-tiled-map [path unit & options] @@ -113,7 +116,7 @@ (defmacro isometric-staggered-tiled-map! [screen k & options] - `(u/call! ^IsometricStaggeredTiledMapRenderer (:renderer ~screen) + `(u/call! ^IsometricStaggeredTiledMapRenderer (or (:renderer ~screen) ~screen) ~k ~@options)) (defn hexagonal-tiled-map* @@ -127,7 +130,8 @@ (defmacro hexagonal-tiled-map! [screen k & options] - `(u/call! ^HexagonalTiledMapRenderer (:renderer ~screen) ~k ~@options)) + `(u/call! ^HexagonalTiledMapRenderer (or (:renderer ~screen) ~screen) + ~k ~@options)) (defn stage* [] @@ -139,7 +143,7 @@ (defmacro stage! [screen k & options] - `(u/call! ^Stage (:renderer ~screen) ~k ~@options)) + `(u/call! ^Stage (or (:renderer ~screen) ~screen) ~k ~@options)) ; batch @@ -244,7 +248,7 @@ (defmacro orthographic! [screen k & options] - `(u/call! ^OrthographicCamera (:camera ~screen) ~k ~@options)) + `(u/call! ^OrthographicCamera (or (:camera ~screen) ~screen) ~k ~@options)) (defn perspective [] @@ -256,7 +260,7 @@ (defmacro perspective! [screen k & options] - `(u/call! ^PerspectiveCamera (:camera ~screen) ~k ~@options)) + `(u/call! ^PerspectiveCamera (or (:camera ~screen) ~screen) ~k ~@options)) (defn size! [{:keys [^OrthographicCamera camera]} width height] diff --git a/src/play_clj/g2d_physics.clj b/src/play_clj/g2d_physics.clj index 84103c2..5af4457 100644 --- a/src/play_clj/g2d_physics.clj +++ b/src/play_clj/g2d_physics.clj @@ -1,7 +1,8 @@ (ns play-clj.g2d-physics (:require [play-clj.math :as m] [play-clj.utils :as u]) - (:import [com.badlogic.gdx.physics.box2d Body BodyDef ContactListener World])) + (:import [com.badlogic.gdx.physics.box2d Body BodyDef ContactListener + FixtureDef World])) ; world @@ -23,36 +24,51 @@ [screen k & options] `(u/call! ^World (:world ~screen) ~k ~@options)) -; body +; bodies (defmacro body-type [k] `~(symbol (str u/main-package ".physics.box2d.BodyDef$BodyType/" (u/key->pascal k) "Body"))) -(defn body-def* - [type-symbol] - (let [bdef (BodyDef.)] - (set! (. bdef type) type-symbol) - bdef)) - -(defmacro body-def - [type-name] - `(body-def* (body-type ~type-name))) - -(defn body* - [screen entity bdef] - (assoc entity :body (box-2d! screen :create-body bdef))) - -(defmacro body - [screen entity type-name & options] - `(let [entity# (body* ~screen ~entity (body-def ~type-name))] - (u/calls! ^Body (:body entity#) ~@options) - entity#)) +(defn body + [& {:keys [] :as options}] + (let [body-def (BodyDef.)] + (doseq [[k v] options] + (case k + :type (set! (. body-def type) v) + (u/throw-key-not-found k))) + body-def)) (defmacro body! [entity k & options] - `(u/call! ^Body (:body ~entity) ~k ~@options)) + `(u/call! ^Body (or (:body ~entity) ~entity) ~k ~@options)) + +(defn create-body!* + [screen body-def] + (box-2d! screen :create-body body-def)) + +(defmacro create-body! + [screen type-name & options] + `(let [object# (create-body!* ~screen (body :type (body-type ~type-name)))] + (u/calls! ^Body object# ~@options) + object#)) + +; fixtures + +(defn fixture + [& {:keys [] :as options}] + (let [fixture-def (FixtureDef.)] + (doseq [[k v] options] + (case k + :density (set! (. fixture-def density) v) + :friction (set! (. fixture-def friction) v) + :is-sensor? (set! (. fixture-def isSensor) v) + :restitution (set! (. fixture-def restitution) v) + :shape (set! (. fixture-def shape) v))) + fixture-def)) + +; listeners (defn contact-listener [{:keys [on-begin-contact on-end-contact on-post-solve on-pre-solve]} execute-fn!] diff --git a/src/play_clj/ui.clj b/src/play_clj/ui.clj index 164f710..05d79e2 100644 --- a/src/play_clj/ui.clj +++ b/src/play_clj/ui.clj @@ -79,7 +79,7 @@ :uniform-x (.uniformX cell) :uniform-y (.uniformY cell) :row (.row cell) - (throw (Exception. (str "The keyword " method " is not supported.")))) + (u/throw-key-not-found method)) (apply cell! cell rest-args)) cell)) @@ -99,7 +99,7 @@ (keyword? child) (case child :row (.row ^Table (:object parent)) - (throw (Exception. (str "The keyword " child " is not supported.")))))) + (u/throw-key-not-found child)))) (defn ^:private create-tree-node [child] diff --git a/src/play_clj/utils.clj b/src/play_clj/utils.clj index 5517b22..e19dae3 100644 --- a/src/play_clj/utils.clj +++ b/src/play_clj/utils.clj @@ -4,17 +4,23 @@ [com.badlogic.gdx.scenes.scene2d Actor] [com.badlogic.gdx.utils Array ArrayMap])) +; exceptions + +(defn throw-key-not-found + [k] + (throw (Exception. (str "The keyword " k " is not supported.")))) + ; converting keys (def ^:const main-package "com.badlogic.gdx") (defn ^:private split-key - [key] - (-> key name (s/split #"-"))) + [k] + (-> k name (s/split #"-"))) (defn ^:private join-keys - [keys] - (->> keys (map name) (s/join ".") (str main-package "."))) + [k-list] + (->> k-list (map name) (s/join ".") (str main-package "."))) (defn key->upper [k]