diff --git a/src/frontend/il/app.cljs b/src/frontend/il/app.cljs index 2c17c2b..52494b9 100644 --- a/src/frontend/il/app.cljs +++ b/src/frontend/il/app.cljs @@ -49,22 +49,29 @@ entity-relative-mouse-pos (.toLocal ^js entity-layer global-mouse-pos) send-interval 25 ; Send every 25ms (10 tps) elapsed (.-elapsedMS t) - {:keys [player entities]} (-> (update @state :elapsed + elapsed) - (update/update-state :entities dt layers) - (update/update-state :players dt layers) - (update/update-player dt send-interval layers entity-relative-mouse-pos sb) - (update/update-from-server rx-chan) - (drain-outbox! tx-chan) - (->> (swap! state merge))) + {player :player} @state + {:keys [player entities players]} (-> (update @state :elapsed + elapsed) + (update/update-state :entities dt layers) + (update/update-state :players dt layers) + (update/update-player dt send-interval layers entity-relative-mouse-pos sb) + (update/update-from-server rx-chan) + (drain-outbox! tx-chan) + (->> (swap! state merge))) sx (- (/ (.. app -screen -width) 2) (player :x)) sy (- (/ (.. app -screen -height) 2) (player :y)) entity-renderables (->> (vals entities) (remove #(nil? (% :renderable))) (vec)) + other-players-renderables (->> (vals players) + (remove #(nil? (% :renderable))) + (vec)) world-renderables (vector {:renderable world-layer :x sx :y sy}) player-renderables (vector 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] (let [{renderable :renderable x :x diff --git a/src/frontend/il/update.cljs b/src/frontend/il/update.cljs index da2b49c..d936c9a 100644 --- a/src/frontend/il/update.cljs +++ b/src/frontend/il/update.cljs @@ -17,7 +17,6 @@ (if (and (nil? (e :renderable)) (e :sprite)) (let [{entity-layer :entity-layer} layers renderable (entity/render entity-layer e)] - (js/console.log (clj->js e)) (assoc e :renderable renderable)) e)) @@ -56,16 +55,17 @@ (update :outbox conj {:type "position" :x x :y y})) state))) -;; TODO: Cleanup entities somehow (defn update-state [state key dt layers] (let [{v key} state - new-entities (update-vals v #(-> % - (apply-server-position) - (apply-renderable layers) - (apply-velocity dt)))] - (assoc state key new-entities))) + _ (js/console.log (clj->js v)) + new-values (update-vals v #(-> % + (apply-server-position) + (apply-renderable layers) + (apply-velocity dt)))] + (assoc state key new-values))) (defn update-player [state dt send-interval layers mouse-pos sb] + (println state) (let [{player :player} state updated-player (-> player (apply-renderable layers) diff --git a/src/il/core.clj b/src/il/core.clj index 6600bc3..b5cf311 100644 --- a/src/il/core.clj +++ b/src/il/core.clj @@ -12,14 +12,20 @@ [il.system.movement :as movement])) (defn ws-handler [state state-chan player-id] + (println "Starting session for " player-id) (go-websocket [in out err] (go-loop [] (when-let [e (= count max-inputs-per-tick) @@ -77,16 +80,28 @@ entities (updated-state :entities) players (updated-state :players)] (doseq [{:keys [initialized data out] :as player} (vals players)] - (when-not (nil? out) - (when (nil? initialized) - (>! out (j/to-json (assoc (merge data (select-keys player [:x :y])) :type "init"))) - (s/change state-chan update-in [:players (data :id)] assoc :initialized true)) - (>! out (j/to-json {:type "sync" - :entities entities - :players (update-vals players #(select-keys % [:x :y :data :sprite]))}))))) + (let [player-id (data :id)] + (println player) + (when-not (nil? out) + (when-not initialized + (let [coords (select-keys player [:x :y]) + data-to-send (conj data coords) + 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) sleep-time (max 0 (- 50 elapsed))] (