Improve body functions and allow graphics macros to work on both the screen and the objects themselves

This commit is contained in:
oakes
2014-01-17 18:11:37 -05:00
parent 6b1eda86c8
commit b703780089
5 changed files with 69 additions and 43 deletions

View File

@@ -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

View File

@@ -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]

View File

@@ -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!]

View File

@@ -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]

View File

@@ -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]