dparis / phzr

A ClojureScript wrapper for the Phaser HTML5 game framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Problems with implementing Phaser Tutorial

turtle-bazon opened this issue · comments

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.

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)

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)

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.