Improve body functions and allow graphics macros to work on both the screen and the objects themselves
This commit is contained in:
@@ -49,8 +49,8 @@
|
|||||||
; input/output
|
; input/output
|
||||||
|
|
||||||
(defn game
|
(defn game
|
||||||
[key]
|
[k]
|
||||||
(case key
|
(case k
|
||||||
:width (graphics! :get-width)
|
:width (graphics! :get-width)
|
||||||
:height (graphics! :get-height)
|
:height (graphics! :get-height)
|
||||||
:fps (graphics! :get-frames-per-second)
|
:fps (graphics! :get-frames-per-second)
|
||||||
@@ -58,15 +58,15 @@
|
|||||||
:is-touched? (input! :is-touched)
|
:is-touched? (input! :is-touched)
|
||||||
:x (input! :get-x)
|
:x (input! :get-x)
|
||||||
:y (input! :get-y)
|
:y (input! :get-y)
|
||||||
nil))
|
(u/throw-key-not-found k)))
|
||||||
|
|
||||||
(defmacro key-code
|
(defmacro key-code
|
||||||
[key]
|
[k]
|
||||||
`~(symbol (str u/main-package ".Input$Keys/" (u/key->upper key))))
|
`~(symbol (str u/main-package ".Input$Keys/" (u/key->upper k))))
|
||||||
|
|
||||||
(defmacro is-pressed?
|
(defmacro is-pressed?
|
||||||
[key]
|
[k]
|
||||||
`(input! :is-key-pressed (key-code ~key)))
|
`(input! :is-key-pressed (key-code ~k)))
|
||||||
|
|
||||||
(defn ^:private input-processor
|
(defn ^:private input-processor
|
||||||
[{:keys [on-key-down on-key-typed on-key-up on-mouse-moved
|
[{:keys [on-key-down on-key-typed on-key-up on-mouse-moved
|
||||||
|
|||||||
@@ -86,7 +86,8 @@
|
|||||||
|
|
||||||
(defmacro orthogonal-tiled-map!
|
(defmacro orthogonal-tiled-map!
|
||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^OrthogonalTiledMapRenderer (:renderer ~screen) ~k ~@options))
|
`(u/call! ^OrthogonalTiledMapRenderer (or (:renderer ~screen) ~screen)
|
||||||
|
~k ~@options))
|
||||||
|
|
||||||
(defn isometric-tiled-map*
|
(defn isometric-tiled-map*
|
||||||
[path unit]
|
[path unit]
|
||||||
@@ -99,11 +100,13 @@
|
|||||||
|
|
||||||
(defmacro isometric-tiled-map!
|
(defmacro isometric-tiled-map!
|
||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^IsometricTiledMapRenderer (:renderer ~screen) ~k ~@options))
|
`(u/call! ^IsometricTiledMapRenderer (or (:renderer ~screen) ~screen)
|
||||||
|
~k ~@options))
|
||||||
|
|
||||||
(defn isometric-staggered-tiled-map*
|
(defn isometric-staggered-tiled-map*
|
||||||
[path unit]
|
[path unit]
|
||||||
(IsometricStaggeredTiledMapRenderer. ^TiledMap (tiled-map* path) ^double unit))
|
(IsometricStaggeredTiledMapRenderer. ^TiledMap (tiled-map* path)
|
||||||
|
^double unit))
|
||||||
|
|
||||||
(defmacro isometric-staggered-tiled-map
|
(defmacro isometric-staggered-tiled-map
|
||||||
[path unit & options]
|
[path unit & options]
|
||||||
@@ -113,7 +116,7 @@
|
|||||||
|
|
||||||
(defmacro isometric-staggered-tiled-map!
|
(defmacro isometric-staggered-tiled-map!
|
||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^IsometricStaggeredTiledMapRenderer (:renderer ~screen)
|
`(u/call! ^IsometricStaggeredTiledMapRenderer (or (:renderer ~screen) ~screen)
|
||||||
~k ~@options))
|
~k ~@options))
|
||||||
|
|
||||||
(defn hexagonal-tiled-map*
|
(defn hexagonal-tiled-map*
|
||||||
@@ -127,7 +130,8 @@
|
|||||||
|
|
||||||
(defmacro hexagonal-tiled-map!
|
(defmacro hexagonal-tiled-map!
|
||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^HexagonalTiledMapRenderer (:renderer ~screen) ~k ~@options))
|
`(u/call! ^HexagonalTiledMapRenderer (or (:renderer ~screen) ~screen)
|
||||||
|
~k ~@options))
|
||||||
|
|
||||||
(defn stage*
|
(defn stage*
|
||||||
[]
|
[]
|
||||||
@@ -139,7 +143,7 @@
|
|||||||
|
|
||||||
(defmacro stage!
|
(defmacro stage!
|
||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^Stage (:renderer ~screen) ~k ~@options))
|
`(u/call! ^Stage (or (:renderer ~screen) ~screen) ~k ~@options))
|
||||||
|
|
||||||
; batch
|
; batch
|
||||||
|
|
||||||
@@ -244,7 +248,7 @@
|
|||||||
|
|
||||||
(defmacro orthographic!
|
(defmacro orthographic!
|
||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^OrthographicCamera (:camera ~screen) ~k ~@options))
|
`(u/call! ^OrthographicCamera (or (:camera ~screen) ~screen) ~k ~@options))
|
||||||
|
|
||||||
(defn perspective
|
(defn perspective
|
||||||
[]
|
[]
|
||||||
@@ -256,7 +260,7 @@
|
|||||||
|
|
||||||
(defmacro perspective!
|
(defmacro perspective!
|
||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^PerspectiveCamera (:camera ~screen) ~k ~@options))
|
`(u/call! ^PerspectiveCamera (or (:camera ~screen) ~screen) ~k ~@options))
|
||||||
|
|
||||||
(defn size!
|
(defn size!
|
||||||
[{:keys [^OrthographicCamera camera]} width height]
|
[{:keys [^OrthographicCamera camera]} width height]
|
||||||
|
|||||||
@@ -1,7 +1,8 @@
|
|||||||
(ns play-clj.g2d-physics
|
(ns play-clj.g2d-physics
|
||||||
(:require [play-clj.math :as m]
|
(:require [play-clj.math :as m]
|
||||||
[play-clj.utils :as u])
|
[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
|
; world
|
||||||
|
|
||||||
@@ -23,36 +24,51 @@
|
|||||||
[screen k & options]
|
[screen k & options]
|
||||||
`(u/call! ^World (:world ~screen) ~k ~@options))
|
`(u/call! ^World (:world ~screen) ~k ~@options))
|
||||||
|
|
||||||
; body
|
; bodies
|
||||||
|
|
||||||
(defmacro body-type
|
(defmacro body-type
|
||||||
[k]
|
[k]
|
||||||
`~(symbol (str u/main-package ".physics.box2d.BodyDef$BodyType/"
|
`~(symbol (str u/main-package ".physics.box2d.BodyDef$BodyType/"
|
||||||
(u/key->pascal k) "Body")))
|
(u/key->pascal k) "Body")))
|
||||||
|
|
||||||
(defn body-def*
|
(defn body
|
||||||
[type-symbol]
|
[& {:keys [] :as options}]
|
||||||
(let [bdef (BodyDef.)]
|
(let [body-def (BodyDef.)]
|
||||||
(set! (. bdef type) type-symbol)
|
(doseq [[k v] options]
|
||||||
bdef))
|
(case k
|
||||||
|
:type (set! (. body-def type) v)
|
||||||
(defmacro body-def
|
(u/throw-key-not-found k)))
|
||||||
[type-name]
|
body-def))
|
||||||
`(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#))
|
|
||||||
|
|
||||||
(defmacro body!
|
(defmacro body!
|
||||||
[entity k & options]
|
[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
|
(defn contact-listener
|
||||||
[{:keys [on-begin-contact on-end-contact on-post-solve on-pre-solve]} execute-fn!]
|
[{:keys [on-begin-contact on-end-contact on-post-solve on-pre-solve]} execute-fn!]
|
||||||
|
|||||||
@@ -79,7 +79,7 @@
|
|||||||
:uniform-x (.uniformX cell)
|
:uniform-x (.uniformX cell)
|
||||||
:uniform-y (.uniformY cell)
|
:uniform-y (.uniformY cell)
|
||||||
:row (.row cell)
|
:row (.row cell)
|
||||||
(throw (Exception. (str "The keyword " method " is not supported."))))
|
(u/throw-key-not-found method))
|
||||||
(apply cell! cell rest-args))
|
(apply cell! cell rest-args))
|
||||||
cell))
|
cell))
|
||||||
|
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
(keyword? child)
|
(keyword? child)
|
||||||
(case child
|
(case child
|
||||||
:row (.row ^Table (:object parent))
|
: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
|
(defn ^:private create-tree-node
|
||||||
[child]
|
[child]
|
||||||
|
|||||||
@@ -4,17 +4,23 @@
|
|||||||
[com.badlogic.gdx.scenes.scene2d Actor]
|
[com.badlogic.gdx.scenes.scene2d Actor]
|
||||||
[com.badlogic.gdx.utils Array ArrayMap]))
|
[com.badlogic.gdx.utils Array ArrayMap]))
|
||||||
|
|
||||||
|
; exceptions
|
||||||
|
|
||||||
|
(defn throw-key-not-found
|
||||||
|
[k]
|
||||||
|
(throw (Exception. (str "The keyword " k " is not supported."))))
|
||||||
|
|
||||||
; converting keys
|
; converting keys
|
||||||
|
|
||||||
(def ^:const main-package "com.badlogic.gdx")
|
(def ^:const main-package "com.badlogic.gdx")
|
||||||
|
|
||||||
(defn ^:private split-key
|
(defn ^:private split-key
|
||||||
[key]
|
[k]
|
||||||
(-> key name (s/split #"-")))
|
(-> k name (s/split #"-")))
|
||||||
|
|
||||||
(defn ^:private join-keys
|
(defn ^:private join-keys
|
||||||
[keys]
|
[k-list]
|
||||||
(->> keys (map name) (s/join ".") (str main-package ".")))
|
(->> k-list (map name) (s/join ".") (str main-package ".")))
|
||||||
|
|
||||||
(defn key->upper
|
(defn key->upper
|
||||||
[k]
|
[k]
|
||||||
|
|||||||
Reference in New Issue
Block a user