More stuff
This commit is contained in:
@@ -49,22 +49,29 @@
|
|||||||
entity-relative-mouse-pos (.toLocal ^js entity-layer global-mouse-pos)
|
entity-relative-mouse-pos (.toLocal ^js entity-layer global-mouse-pos)
|
||||||
send-interval 25 ; Send every 25ms (10 tps)
|
send-interval 25 ; Send every 25ms (10 tps)
|
||||||
elapsed (.-elapsedMS t)
|
elapsed (.-elapsedMS t)
|
||||||
{:keys [player entities]} (-> (update @state :elapsed + elapsed)
|
{player :player} @state
|
||||||
(update/update-state :entities dt layers)
|
{:keys [player entities players]} (-> (update @state :elapsed + elapsed)
|
||||||
(update/update-state :players dt layers)
|
(update/update-state :entities dt layers)
|
||||||
(update/update-player dt send-interval layers entity-relative-mouse-pos sb)
|
(update/update-state :players dt layers)
|
||||||
(update/update-from-server rx-chan)
|
(update/update-player dt send-interval layers entity-relative-mouse-pos sb)
|
||||||
(drain-outbox! tx-chan)
|
(update/update-from-server rx-chan)
|
||||||
(->> (swap! state merge)))
|
(drain-outbox! tx-chan)
|
||||||
|
(->> (swap! state merge)))
|
||||||
sx (- (/ (.. app -screen -width) 2) (player :x))
|
sx (- (/ (.. app -screen -width) 2) (player :x))
|
||||||
sy (- (/ (.. app -screen -height) 2) (player :y))
|
sy (- (/ (.. app -screen -height) 2) (player :y))
|
||||||
entity-renderables (->> (vals entities)
|
entity-renderables (->> (vals entities)
|
||||||
(remove #(nil? (% :renderable)))
|
(remove #(nil? (% :renderable)))
|
||||||
(vec))
|
(vec))
|
||||||
|
other-players-renderables (->> (vals players)
|
||||||
|
(remove #(nil? (% :renderable)))
|
||||||
|
(vec))
|
||||||
world-renderables (vector {:renderable world-layer :x sx :y sy})
|
world-renderables (vector {:renderable world-layer :x sx :y sy})
|
||||||
player-renderables (vector player
|
player-renderables (vector player
|
||||||
(assoc player :renderable (:shootbox player)))
|
(assoc player :renderable (:shootbox player)))
|
||||||
things-to-update (concat player-renderables entity-renderables world-renderables)]
|
things-to-update (concat player-renderables
|
||||||
|
other-players-renderables
|
||||||
|
entity-renderables
|
||||||
|
world-renderables)]
|
||||||
(doseq [thing things-to-update]
|
(doseq [thing things-to-update]
|
||||||
(let [{renderable :renderable
|
(let [{renderable :renderable
|
||||||
x :x
|
x :x
|
||||||
|
|||||||
@@ -17,7 +17,6 @@
|
|||||||
(if (and (nil? (e :renderable)) (e :sprite))
|
(if (and (nil? (e :renderable)) (e :sprite))
|
||||||
(let [{entity-layer :entity-layer} layers
|
(let [{entity-layer :entity-layer} layers
|
||||||
renderable (entity/render entity-layer e)]
|
renderable (entity/render entity-layer e)]
|
||||||
(js/console.log (clj->js e))
|
|
||||||
(assoc e :renderable renderable))
|
(assoc e :renderable renderable))
|
||||||
e))
|
e))
|
||||||
|
|
||||||
@@ -56,16 +55,17 @@
|
|||||||
(update :outbox conj {:type "position" :x x :y y}))
|
(update :outbox conj {:type "position" :x x :y y}))
|
||||||
state)))
|
state)))
|
||||||
|
|
||||||
;; TODO: Cleanup entities somehow
|
|
||||||
(defn update-state [state key dt layers]
|
(defn update-state [state key dt layers]
|
||||||
(let [{v key} state
|
(let [{v key} state
|
||||||
new-entities (update-vals v #(-> %
|
_ (js/console.log (clj->js v))
|
||||||
(apply-server-position)
|
new-values (update-vals v #(-> %
|
||||||
(apply-renderable layers)
|
(apply-server-position)
|
||||||
(apply-velocity dt)))]
|
(apply-renderable layers)
|
||||||
(assoc state key new-entities)))
|
(apply-velocity dt)))]
|
||||||
|
(assoc state key new-values)))
|
||||||
|
|
||||||
(defn update-player [state dt send-interval layers mouse-pos sb]
|
(defn update-player [state dt send-interval layers mouse-pos sb]
|
||||||
|
(println state)
|
||||||
(let [{player :player} state
|
(let [{player :player} state
|
||||||
updated-player (-> player
|
updated-player (-> player
|
||||||
(apply-renderable layers)
|
(apply-renderable layers)
|
||||||
|
|||||||
@@ -12,14 +12,20 @@
|
|||||||
[il.system.movement :as movement]))
|
[il.system.movement :as movement]))
|
||||||
|
|
||||||
(defn ws-handler [state state-chan player-id]
|
(defn ws-handler [state state-chan player-id]
|
||||||
|
(println "Starting session for " player-id)
|
||||||
(go-websocket [in out err]
|
(go-websocket [in out err]
|
||||||
(go-loop []
|
(go-loop []
|
||||||
(when-let [e (<! err)]
|
(when-let [e (<! err)]
|
||||||
(println (.getMessage e))
|
(println (.getMessage e))
|
||||||
(recur)))
|
(recur)))
|
||||||
(go-loop []
|
(go-loop []
|
||||||
(if-let [raw (<! in)]
|
(if-not (contains? (@state :players) player-id)
|
||||||
(if (contains? (@state :players) player-id)
|
(do (s/change state-chan update :players assoc player-id {:out out :in in :err err
|
||||||
|
:x 0 :y 0
|
||||||
|
:initialized false
|
||||||
|
:data (merge p/default-player {:id player-id})})
|
||||||
|
(recur))
|
||||||
|
(if-let [raw (<! in)]
|
||||||
(let [msg (j/from-json raw)
|
(let [msg (j/from-json raw)
|
||||||
type (get msg :type "invalid")
|
type (get msg :type "invalid")
|
||||||
state @state]
|
state @state]
|
||||||
@@ -31,12 +37,9 @@
|
|||||||
(println msg)
|
(println msg)
|
||||||
(println state)
|
(println state)
|
||||||
(recur))
|
(recur))
|
||||||
(do (s/change state-chan update :players assoc player-id {:out out :in in :err err :x 0 :y 0
|
(do
|
||||||
:data (merge p/default-player {:id player-id})})
|
(s/change state-chan update :players dissoc player-id)
|
||||||
(recur)))
|
(println "Closed: " player-id)))))))
|
||||||
(do
|
|
||||||
(s/change state-chan update :players dissoc player-id)
|
|
||||||
(println "Closed: " player-id))))))
|
|
||||||
|
|
||||||
(defn index-handler [_]
|
(defn index-handler [_]
|
||||||
(h/html
|
(h/html
|
||||||
@@ -58,7 +61,7 @@
|
|||||||
(defn game-loop [state state-chan]
|
(defn game-loop [state state-chan]
|
||||||
(go-loop []
|
(go-loop []
|
||||||
(let [start-time (System/currentTimeMillis)
|
(let [start-time (System/currentTimeMillis)
|
||||||
max-inputs-per-tick 15000 ; Stops the game from spinning for too long with events endlessly, dropping ticks
|
max-inputs-per-tick 15000 ; Stops the game from spinning for too long with events endlessly dropping ticks
|
||||||
events-to-apply (loop [inputs []
|
events-to-apply (loop [inputs []
|
||||||
count 0]
|
count 0]
|
||||||
(if (>= count max-inputs-per-tick)
|
(if (>= count max-inputs-per-tick)
|
||||||
@@ -77,16 +80,28 @@
|
|||||||
entities (updated-state :entities)
|
entities (updated-state :entities)
|
||||||
players (updated-state :players)]
|
players (updated-state :players)]
|
||||||
(doseq [{:keys [initialized data out] :as player} (vals players)]
|
(doseq [{:keys [initialized data out] :as player} (vals players)]
|
||||||
(when-not (nil? out)
|
(let [player-id (data :id)]
|
||||||
(when (nil? initialized)
|
(println player)
|
||||||
(>! out (j/to-json (assoc (merge data (select-keys player [:x :y])) :type "init")))
|
(when-not (nil? out)
|
||||||
(s/change state-chan update-in [:players (data :id)] assoc :initialized true))
|
(when-not initialized
|
||||||
(>! out (j/to-json {:type "sync"
|
(let [coords (select-keys player [:x :y])
|
||||||
:entities entities
|
data-to-send (conj data coords)
|
||||||
:players (update-vals players #(select-keys % [:x :y :data :sprite]))})))))
|
msg (assoc data-to-send :type "init")]
|
||||||
|
(println "Initializing " player-id)
|
||||||
|
(async/put! out (j/to-json msg))
|
||||||
|
(s/change state-chan update-in [:players player-id] assoc :initialized true)))
|
||||||
|
(let [players (update-vals players (fn [e] (-> e
|
||||||
|
(select-keys [:x :y :data])
|
||||||
|
(#(merge (dissoc % :data) (get % :data))))))
|
||||||
|
players-without-player-id (dissoc players player-id)] ; Strip the selected player from the update
|
||||||
|
(async/put! out (j/to-json {:type "sync"
|
||||||
|
:entities entities
|
||||||
|
:players players-without-player-id})))))))
|
||||||
|
|
||||||
(let [elapsed (- (System/currentTimeMillis) start-time)
|
(let [elapsed (- (System/currentTimeMillis) start-time)
|
||||||
sleep-time (max 0 (- 50 elapsed))]
|
sleep-time (max 0 (- 50 elapsed))]
|
||||||
(<! (async/timeout sleep-time)))
|
(<! (async/timeout sleep-time)))
|
||||||
|
|
||||||
(recur))))
|
(recur))))
|
||||||
|
|
||||||
(defn -main []
|
(defn -main []
|
||||||
|
|||||||
@@ -3,11 +3,10 @@
|
|||||||
[il.common.velocity :as v]))
|
[il.common.velocity :as v]))
|
||||||
|
|
||||||
(defn handle-position [_ state-chan player-id {x :x y :y}]
|
(defn handle-position [_ state-chan player-id {x :x y :y}]
|
||||||
(println "Setting player movement: " player-id x y)
|
|
||||||
(s/change state-chan update-in [:players player-id] assoc :x x :y y))
|
(s/change state-chan update-in [:players player-id] assoc :x x :y y))
|
||||||
|
|
||||||
(defn handle-request-init [_ state-chan player-id _]
|
(defn handle-request-init [_ state-chan player-id _]
|
||||||
(s/change state-chan update-in [:players player-id] dissoc :initialized))
|
(s/change state-chan update-in [:players player-id] assoc :initialized false))
|
||||||
|
|
||||||
(defn handle-shoot [_ state-chan player-id msg]
|
(defn handle-shoot [_ state-chan player-id msg]
|
||||||
(let [bullet-id (random-uuid)
|
(let [bullet-id (random-uuid)
|
||||||
|
|||||||
@@ -9,5 +9,4 @@
|
|||||||
:race race/human
|
:race race/human
|
||||||
:class class/priest}
|
:class class/priest}
|
||||||
:sprite "https://pixijs.com/assets/bunny.png"
|
:sprite "https://pixijs.com/assets/bunny.png"
|
||||||
:speed 10
|
:speed 10})
|
||||||
:renderable nil})
|
|
||||||
|
|||||||
Reference in New Issue
Block a user