|  |  |  | @ -1,25 +1,19 @@ | 
		
	
		
			
				|  |  |  |  | (ns topdown2d.demoscene | 
		
	
		
			
				|  |  |  |  |   (:require | 
		
	
		
			
				|  |  |  |  |     [topdown2d.objects :as objects] | 
		
	
		
			
				|  |  |  |  |     [topdown2d.collision :as collision] | 
		
	
		
			
				|  |  |  |  |     [topdown2d.input :as input] | 
		
	
		
			
				|  |  |  |  |     [topdown2d.sprites :as sprites])) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | (defn init [gamestate scenedata] | 
		
	
		
			
				|  |  |  |  |   (assoc scenedata | 
		
	
		
			
				|  |  |  |  |     :data { | 
		
	
		
			
				|  |  |  |  |       :bumper { | 
		
	
		
			
				|  |  |  |  |         :x 100 | 
		
	
		
			
				|  |  |  |  |         :y 80 | 
		
	
		
			
				|  |  |  |  |         :w 50 | 
		
	
		
			
				|  |  |  |  |         :h 50 | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       :player { | 
		
	
		
			
				|  |  |  |  |         :x 0 :y 0 | 
		
	
		
			
				|  |  |  |  |         :x (- (/ (get-in gamestate [:dimensions :w]) 2) 32) | 
		
	
		
			
				|  |  |  |  |         :y (- (/ (get-in gamestate [:dimensions :h]) 2) 32) | 
		
	
		
			
				|  |  |  |  |         :w 64 :h 64 | 
		
	
		
			
				|  |  |  |  |         :pps 150 | 
		
	
		
			
				|  |  |  |  |         :d :? | 
		
	
		
			
				|  |  |  |  |         :sprite { | 
		
	
		
			
				|  |  |  |  |           :image (.getElementById js/document "player") | 
		
	
		
			
				|  |  |  |  |           :image (.getElementById js/document "demo-player") | 
		
	
		
			
				|  |  |  |  |           :size 64 | 
		
	
		
			
				|  |  |  |  |           :d :s | 
		
	
		
			
				|  |  |  |  |           :rows { | 
		
	
	
		
			
				
					|  |  |  | @ -28,15 +22,26 @@ | 
		
	
		
			
				|  |  |  |  |             :? 2 | 
		
	
		
			
				|  |  |  |  |           } | 
		
	
		
			
				|  |  |  |  |           :cycle { | 
		
	
		
			
				|  |  |  |  |             :count 8 | 
		
	
		
			
				|  |  |  |  |             :from 1 | 
		
	
		
			
				|  |  |  |  |             :pos 0 | 
		
	
		
			
				|  |  |  |  |             :from 1 :count 8 | 
		
	
		
			
				|  |  |  |  |             :last-cycle 0 | 
		
	
		
			
				|  |  |  |  |             ; seconds per cycle | 
		
	
		
			
				|  |  |  |  |             :spc 0.08 | 
		
	
		
			
				|  |  |  |  |           } | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       :viewport { | 
		
	
		
			
				|  |  |  |  |         :image (.getElementById js/document "demo-background") | 
		
	
		
			
				|  |  |  |  |         :keep-in { | 
		
	
		
			
				|  |  |  |  |           :x 0 :y 0 | 
		
	
		
			
				|  |  |  |  |           :w 2239 :h 2235 | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |         :x 1 :y 1 | 
		
	
		
			
				|  |  |  |  |         :d :? | 
		
	
		
			
				|  |  |  |  |         :pps 350 | 
		
	
		
			
				|  |  |  |  |         :w (get-in gamestate [:dimensions :w]) | 
		
	
		
			
				|  |  |  |  |         :h (get-in gamestate [:dimensions :h]) | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     })) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | (defn update-player [gamestate player dir] | 
		
	
	
		
			
				
					|  |  |  | @ -50,17 +55,30 @@ | 
		
	
		
			
				|  |  |  |  |         (sprites/proc-cycle gamestate p) | 
		
	
		
			
				|  |  |  |  |         p)))) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | (defn update-viewport [gamestate viewport dir] | 
		
	
		
			
				|  |  |  |  |   (collision/move-inside | 
		
	
		
			
				|  |  |  |  |     (assoc viewport :d dir) | 
		
	
		
			
				|  |  |  |  |     (:keep-in viewport) | 
		
	
		
			
				|  |  |  |  |     (collision/pps->px gamestate viewport))) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | (defn update-scene [gamestate scenedata] | 
		
	
		
			
				|  |  |  |  |   (let [player (get-in scenedata [:data :player]) | 
		
	
		
			
				|  |  |  |  |         viewport (get-in scenedata [:data :viewport]) | 
		
	
		
			
				|  |  |  |  |         dir (input/dirinput)] | 
		
	
		
			
				|  |  |  |  |     (assoc-in scenedata | 
		
	
		
			
				|  |  |  |  |       [:data :player] | 
		
	
		
			
				|  |  |  |  |       (update-player gamestate player dir)))) | 
		
	
		
			
				|  |  |  |  |     (-> scenedata | 
		
	
		
			
				|  |  |  |  |       (assoc-in [:data :player] | 
		
	
		
			
				|  |  |  |  |         (update-player gamestate player dir)) | 
		
	
		
			
				|  |  |  |  |       (assoc-in [:data :viewport] | 
		
	
		
			
				|  |  |  |  |         (update-viewport gamestate viewport dir))))) | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | (defn draw-scene [gamestate scenedata] | 
		
	
		
			
				|  |  |  |  |   (let [{{:keys [bumper player]} :data} scenedata | 
		
	
		
			
				|  |  |  |  |         ctx (:ctx gamestate)] | 
		
	
		
			
				|  |  |  |  |     (let [{:keys [x y w h]} bumper] | 
		
	
		
			
				|  |  |  |  |       (.fillRect ctx | 
		
	
		
			
				|  |  |  |  |         x y w h)) | 
		
	
		
			
				|  |  |  |  |     (sprites/draw gamestate player))) | 
		
	
		
			
				|  |  |  |  |   (let [viewport (get-in scenedata [:data :viewport]) | 
		
	
		
			
				|  |  |  |  |         {:keys [x y w h background]} viewport] | 
		
	
		
			
				|  |  |  |  |     (.drawImage | 
		
	
		
			
				|  |  |  |  |       (:ctx gamestate) | 
		
	
		
			
				|  |  |  |  |       (:image viewport) | 
		
	
		
			
				|  |  |  |  |       x y w h | 
		
	
		
			
				|  |  |  |  |       0 0 w h)) | 
		
	
		
			
				|  |  |  |  |   (sprites/draw | 
		
	
		
			
				|  |  |  |  |     gamestate | 
		
	
		
			
				|  |  |  |  |     (get-in scenedata [:data :player]))) | 
		
	
	
		
			
				
					|  |  |  | 
 |