player rendering

This commit is contained in:
2026-07-22 22:39:40 -06:00
parent f11ce94adf
commit ba10d04fa2
4 changed files with 57 additions and 26 deletions

View File

@@ -4,8 +4,6 @@
["pixi.js" :as pixi] ["pixi.js" :as pixi]
[goog.dom :as dom] [goog.dom :as dom]
[cljs.core.async :as async :refer [go go-loop <! >!]] [cljs.core.async :as async :refer [go go-loop <! >!]]
[il.common.race :as race]
[il.common.class :as class]
[frontend.il.entity :as entity] [frontend.il.entity :as entity]
[frontend.il.update :as update])) [frontend.il.update :as update]))
@@ -53,6 +51,7 @@
elapsed (.-elapsedMS t) elapsed (.-elapsedMS t)
{:keys [player entities]} (-> (update @state :elapsed + elapsed) {:keys [player entities]} (-> (update @state :elapsed + elapsed)
(update/update-entities dt layers) (update/update-entities dt layers)
(update/update-players dt layers)
(update/update-player dt send-interval layers entity-relative-mouse-pos) (update/update-player dt send-interval layers entity-relative-mouse-pos)
(update/update-from-server rx-chan) (update/update-from-server rx-chan)
(drain-outbox! tx-chan) (drain-outbox! tx-chan)
@@ -67,8 +66,6 @@
(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 entity-renderables world-renderables)]
(doseq [thing things-to-update] (doseq [thing things-to-update]
; TODO: Add lerp here, we shouldn't just launch things around with their X/Y
; instead if the difference between curr-pos and tar-pos is > than vel try to move it to their every frame via vel
(let [{renderable :renderable (let [{renderable :renderable
x :x x :x
y :y} thing] y :y} thing]
@@ -80,17 +77,11 @@
(.init {:resizeTo js/window :autoDensity true :resolution (.-devicePixelRatio js/window)})) (.init {:resizeTo js/window :autoDensity true :resolution (.-devicePixelRatio js/window)}))
state (atom {:player {:velocity {:x 0 :y 0} state (atom {:player {:velocity {:x 0 :y 0}
:keymap {:w 0 :a 0 :s 0 :d 0 :lmb 0} :keymap {:w 0 :a 0 :s 0 :d 0 :lmb 0}
:last-attack -1 :last-attack -1}
:attack-speed 0.66
:meta {:name "Player"
:race race/human
:class class/priest}
:sprite "https://pixijs.com/assets/bunny.png"
:speed 10
:renderable nil}
:elapsed 0 :elapsed 0
:outbox [] :outbox []
:entities {}}) :entities {}
:players {}})
width (.-width js/window.screen) width (.-width js/window.screen)
height (.-height js/window.screen) height (.-height js/window.screen)
stage (.-stage app) stage (.-stage app)

View File

@@ -64,6 +64,14 @@
(apply-velocity dt)))] (apply-velocity dt)))]
(assoc state :entities new-entities))) (assoc state :entities new-entities)))
(defn update-players [state dt layers]
(let [{players :players} state
new-players (update-vals players #(-> %
(apply-server-position)
(apply-renderable layers)
(apply-velocity dt)))]
(assoc state :players new-players)))
(defn update-player [state dt send-interval layers mouse-pos] (defn update-player [state dt send-interval layers mouse-pos]
(let [{player :player} state (let [{player :player} state
updated-player (-> player updated-player (-> player
@@ -84,14 +92,27 @@
(defn update-from-server [state rx-chan] (defn update-from-server [state rx-chan]
(loop [state-acc state (loop [state-acc state
{:keys [type] :as msg} (async/poll! rx-chan)] {:keys [type] :as msg} (async/poll! rx-chan)]
(if (and (not (nil? msg)) (= type "sync")) (if-not (nil? msg)
(let [entities (msg :entities) (cond
state-entities (state-acc :entities) (= type "init") (update state-acc :player merge msg)
tx-entities (update-vals entities (fn [e] {:sprite (:sprite e) (= type "sync") (let [entities (msg :entities)
:tx (:x e) players (if-not (nil? (get-in state-acc [:player :id]))
:ty (:y e)})) (dissoc (msg :players) (get-in state-acc [:player :id]))
merged-entities (deep-merge state-entities tx-entities)] {})
(recur state-entities (state-acc :entities)
(assoc state-acc :entities merged-entities) state-players (state-acc :players)
(async/poll! rx-chan))) tx-entities (update-vals entities (fn [e] {:sprite (:sprite e)
:tx (:x e)
:ty (:y e)}))
tx-players (update-vals players (fn [e] {:sprite (:sprite e)
:tx (:x e)
:ty (:y e)}))
merged-entities (deep-merge state-entities tx-entities)
merged-players (deep-merge state-players tx-players)]
(recur
(assoc state-acc
:entities merged-entities
:players merged-players)
(async/poll! rx-chan)))
:else state-acc)
state-acc))) state-acc)))

View File

@@ -5,6 +5,7 @@
[compojure.route :as route] [compojure.route :as route]
[clojure.core.async :as async :refer [<! >! go-loop]] [clojure.core.async :as async :refer [<! >! go-loop]]
[hiccup.core :as h] [hiccup.core :as h]
[il.player :as p]
[il.state :as s] [il.state :as s]
[il.json :as j] [il.json :as j]
[il.handler :as handler] [il.handler :as handler]
@@ -12,7 +13,8 @@
(defn ws-handler [state state-chan player-id] (defn ws-handler [state state-chan player-id]
(go-websocket [in out err] (go-websocket [in out err]
(s/change state-chan update :players assoc player-id {:out out :in in :err err :x 0 :y 0}) (s/change state-chan update :players assoc player-id {:out out :in in :err err :x 0 :y 0
:data (merge p/default-player {:id player-id})})
(go-loop [] (go-loop []
(when-let [e (<! err)] (when-let [e (<! err)]
(println (.getMessage e)) (println (.getMessage e))
@@ -72,10 +74,14 @@
_ (println updated-state) _ (println updated-state)
entities (updated-state :entities) entities (updated-state :entities)
players (updated-state :players)] players (updated-state :players)]
(doseq [{out :out} (vals players)] (doseq [{out :out init? :initialized data :data} (vals players)]
(when (nil? init?)
(>! out (j/to-json (assoc data :type "init")))
(s/change state-chan update-in [:players (data :id)] assoc :init true))
(when-not (nil? out) (when-not (nil? out)
(>! out (j/to-json {:type "sync" (>! out (j/to-json {:type "sync"
:entities entities}))))) :entities entities
:players players})))))
(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)))

13
src/il/player.clj Normal file
View File

@@ -0,0 +1,13 @@
(ns il.player
(:require
[il.common.race :as race]
[il.common.class :as class]))
(def default-player
{:attack-speed 0.66
:meta {:name "Player"
:race race/human
:class class/priest}
:sprite "https://pixijs.com/assets/bunny.png"
:speed 10
:renderable nil})