From ba10d04fa2198ebbda26ff45a36bdb035eca1c58 Mon Sep 17 00:00:00 2001 From: rawley Date: Wed, 22 Jul 2026 22:39:40 -0600 Subject: [PATCH] player rendering --- src/frontend/il/app.cljs | 17 ++++----------- src/frontend/il/update.cljs | 41 ++++++++++++++++++++++++++++--------- src/il/core.clj | 12 ++++++++--- src/il/player.clj | 13 ++++++++++++ 4 files changed, 57 insertions(+), 26 deletions(-) create mode 100644 src/il/player.clj diff --git a/src/frontend/il/app.cljs b/src/frontend/il/app.cljs index a573643..6192315 100644 --- a/src/frontend/il/app.cljs +++ b/src/frontend/il/app.cljs @@ -4,8 +4,6 @@ ["pixi.js" :as pixi] [goog.dom :as dom] [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.update :as update])) @@ -53,6 +51,7 @@ elapsed (.-elapsedMS t) {:keys [player entities]} (-> (update @state :elapsed + elapsed) (update/update-entities dt layers) + (update/update-players dt layers) (update/update-player dt send-interval layers entity-relative-mouse-pos) (update/update-from-server rx-chan) (drain-outbox! tx-chan) @@ -67,8 +66,6 @@ (assoc player :renderable (:shootbox player))) things-to-update (concat player-renderables entity-renderables world-renderables)] (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 x :x y :y} thing] @@ -80,17 +77,11 @@ (.init {:resizeTo js/window :autoDensity true :resolution (.-devicePixelRatio js/window)})) state (atom {:player {:velocity {:x 0 :y 0} :keymap {:w 0 :a 0 :s 0 :d 0 :lmb 0} - :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} + :last-attack -1} :elapsed 0 :outbox [] - :entities {}}) + :entities {} + :players {}}) width (.-width js/window.screen) height (.-height js/window.screen) stage (.-stage app) diff --git a/src/frontend/il/update.cljs b/src/frontend/il/update.cljs index 807df5d..d32ef63 100644 --- a/src/frontend/il/update.cljs +++ b/src/frontend/il/update.cljs @@ -64,6 +64,14 @@ (apply-velocity dt)))] (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] (let [{player :player} state updated-player (-> player @@ -84,14 +92,27 @@ (defn update-from-server [state rx-chan] (loop [state-acc state {:keys [type] :as msg} (async/poll! rx-chan)] - (if (and (not (nil? msg)) (= type "sync")) - (let [entities (msg :entities) - state-entities (state-acc :entities) - tx-entities (update-vals entities (fn [e] {:sprite (:sprite e) - :tx (:x e) - :ty (:y e)})) - merged-entities (deep-merge state-entities tx-entities)] - (recur - (assoc state-acc :entities merged-entities) - (async/poll! rx-chan))) + (if-not (nil? msg) + (cond + (= type "init") (update state-acc :player merge msg) + (= type "sync") (let [entities (msg :entities) + players (if-not (nil? (get-in state-acc [:player :id])) + (dissoc (msg :players) (get-in state-acc [:player :id])) + {}) + state-entities (state-acc :entities) + state-players (state-acc :players) + 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))) diff --git a/src/il/core.clj b/src/il/core.clj index fadb789..cb8f8e2 100644 --- a/src/il/core.clj +++ b/src/il/core.clj @@ -5,6 +5,7 @@ [compojure.route :as route] [clojure.core.async :as async :refer [! go-loop]] [hiccup.core :as h] + [il.player :as p] [il.state :as s] [il.json :as j] [il.handler :as handler] @@ -12,7 +13,8 @@ (defn ws-handler [state state-chan player-id] (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 [] (when-let [e (! out (j/to-json (assoc data :type "init"))) + (s/change state-chan update-in [:players (data :id)] assoc :init true)) (when-not (nil? out) (>! out (j/to-json {:type "sync" - :entities entities}))))) + :entities entities + :players players}))))) (let [elapsed (- (System/currentTimeMillis) start-time) sleep-time (max 0 (- 50 elapsed))] (