Problems with implementing Phaser Tutorial
turtle-bazon opened this issue · comments
turtle-bazon commented
I try to implement phaser tutorial in phzr Making your first phaser game, but has several problems. When I do ground (pgr/create @*platforms* 0 (- game-world-h 64) "ground")
, and then (pset! (-> ground :body) :immovable true)
problem that body null. Also after
(defn p-update [game] (-> game :physics :arcade (ppa/collide @*player* @*platforms*)))
Collides not works.
turtle-bazon commented
Whole code.
(ns phaser-tutorial.core
(:require
[phzr.animation-manager :as pam]
[phzr.core :as p :refer [pset!]]
[phzr.game :as pg]
[phzr.game-object-factory :as pgof]
[phzr.group :as pgr]
[phzr.loader :as pl]
[phzr.physics :as pp]
[phzr.physics.arcade :as ppa]
[phzr.point :as ppnt]))
(def *platforms* (atom nil))
(def *player* (atom nil))
(defn p-preload [game]
(let [loader (:load game)]
(doto loader
(pl/image "sky" "assets/sky.png")
(pl/image "ground" "assets/platform.png")
(pl/image "star" "assets/star.png")
(pl/spritesheet "dude" "assets/dude.png" 32 48))))
(defn p-create [game]
(let [pgof (:add game)
physics (:physics game)
game-world-h (-> game :world :height)]
(pp/start-system physics (pp/const :arcade))
(pgof/sprite pgof 0 0 "sky")
(reset! *platforms* (-> game :add (pgof/group "platforms" false true)))
(reset! *player* (pgof/sprite pgof 32 (- game-world-h 150) "dude"))
(let [ground (pgr/create @*platforms* 0 (- game-world-h 64) "ground")
ledge1 (pgr/create @*platforms* 400 400 "ground")
ledge2 (pgr/create @*platforms* -150 250 "ground")
player @*player*]
(-> ground :scale (ppnt/set-to 2 2))
;(pset! (-> ground :body) :immovable true)
;(pset! (-> ledge1 :body) :immovable true)
;(pset! (-> ledge2 :body) :immovable true)
(-> physics :arcade (pp/enable player))
(pset! (-> player :body :bounce) :y 0.2)
(pset! (-> player :body :gravity) :y 300)
(pset! (-> player :body) :collide-world-bounds true)
(-> player :animations (pam/add "left" [0 1 2 3] 10 true))
(-> player :animations (pam/add "right" [5 6 7 8] 10 true))
)))
(defn p-update [game]
(-> game :physics :arcade (ppa/collide @*player* @*platforms*)))
(defn start []
(pg/->Game 800 600 (p/phaser-constants :auto) "game"
{"preload" p-preload
"create" p-create
"update" p-update}))
(set! (.-onload js/window) start)
turtle-bazon commented
Interesting. But if I do via js interop directly, I have same result
(ns phaser-tutorial.core
)
(def *platforms* (atom nil))
(defn preload-fn [game]
(let [loader (.-load game)]
(.image loader "sky" "assets/sky.png")
(.image loader "ground" "assets/platform.png")
(.image loader "star" "assets/star.png")
(.spritesheet loader "dude" "assets/dude.png" 32 48)))
(defn create-fn [game]
(let [add (.-add game)]
(.startSystem (.-physics game) js/Phaser.Physics.ARCADE)
(.sprite add 0 0 "sky")
(reset! *platforms* (.group add))
(set! (.-enableBody *platforms*) true)
(let [world-h (.-height (.-world game))
ground (.create @*platforms* 0 (- world-h 64) "ground")
ledge1 (.create @*platforms* 400 400 "ground")
ledge2 (.create @*platforms* -150 250 "ground")]
(.setTo (.-scale ground) 2 2)
(set! (.-immovable (.-body ground)) true)
;(set! (.-immovable (.-body ledge1)) true)
;(set! (.-immovable (.-body ledge2)) true)
)))
(defn update-fn [game]
)
(defn start []
(js/Phaser.Game. 800 600 js/Phaser.AUTO "game"
(js-obj "preload" preload-fn
"create" create-fn
"update" update-fn)))
(set! (.-onload js/window) start)
turtle-bazon commented
In first example problem was in forgetting add physics body to group, in second example problem was in forgetting deref while trying to add property to platforms.