Created
August 8, 2016 02:00
-
-
Save selfsame/5fd6ef4876d14d8722cf05ec89c63313 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(ns game.core | |
(:use | |
arcadia.core | |
arcadia.linear | |
tween.core | |
hard.core | |
hard.input | |
pdfn.core)) | |
(declare fire-bullet make-level) | |
(def orbit-height 2.0) | |
(def speed 0.5) | |
(def bullet-speed 2.0) | |
(defn from-to-rotation [from to] | |
(UnityEngine.Quaternion/FromToRotation from to)) | |
(defn set-rotation! [a b] | |
(set! (.rotation (.transform a)) (.rotation (.transform b)))) | |
(defn planet? [o] (re-find #"planet" (.name o))) | |
(defn ->data-haver [o] | |
(when o | |
(try | |
(or ({{} nil} (state o) o) | |
(->data-haver (parent o))) | |
(catch Exception e nil)))) | |
(defn ship-keys [o] | |
(cond | |
(key? "a") (rotate! o (v3 0 -1.8 0)) | |
(key? "d") (rotate! o (v3 0 1.8 0)))) | |
(defn constrain-to-planet [o] | |
(let [o-speed (or (state o :speed) 0.2) | |
ray (Ray. (->v3 o) (local-direction o (v3 0 -1 0))) | |
hits (ray-hits ray) | |
hit (first (filter #(planet? (->go (.collider %))) hits))] | |
(when hit | |
(let [pos-lerp-rat (+ 0.05 (* 0.5 0.5 0.5 0.5 0.5 o-speed)) | |
rot-lerp-rat (+ 0.12 (* 0.5 0.5 0.5 0.5 0.5 o-speed)) | |
norm-ray (Ray. (.point hit) (.normal hit)) | |
orbit-point (.GetPoint norm-ray orbit-height) | |
fwd (.forward (.transform o)) | |
ship-rotation (.rotation (.transform o)) | |
good-quat | |
(Quaternion/LookRotation | |
(v3- fwd | |
(v3* (.normal hit) | |
(Vector3/Dot fwd (.normal hit)))) | |
(.normal hit)) | |
target-rotation (from-to-rotation (Vector3/up) (.normal hit))] | |
(set! (.rotation (.transform o)) | |
(Quaternion/Lerp ship-rotation good-quat rot-lerp-rat)) | |
(set! (.position (.transform o)) | |
(lerp o orbit-point pos-lerp-rat)) )))) | |
(defn move [o] | |
(let [sp (or (state o :speed) speed) | |
last-pos (or (state o :last-pos) (->v3 o)) | |
desired (v3+ (->v3 o) (local-direction o (v3 sp 0 0))) | |
crv-mod (- sp (.magnitude (v3- desired last-pos))) | |
fixed (v3+ (->v3 o) (local-direction o (v3 (+ sp crv-mod) 0 0)))] | |
(position! o fixed) | |
#_(if (= "ship" (.name o)) | |
(log (- sp (.magnitude (v3- desired last-pos))))) | |
(set-state! o :last-pos (->v3 o)))) | |
(defn update-ship [o] | |
(constrain-to-planet o) | |
(ship-keys o) | |
(move o)) | |
(defn update-bullet [o] | |
(constrain-to-planet o) | |
(move o)) | |
(defn splode | |
([p] (splode p 1)) | |
([p bigness] | |
(dorun (for [i (range (or bigness 5)) | |
:let [rp (v3+ (->v3 p) (?sphere 2.0)) | |
fire (clone! :fire (->v3 p))]] | |
(do | |
(set! (.rotation (.transform fire)) (?rotation)) | |
(set! (.localScale (.transform fire)) (v3 0.2)) | |
(timeline* | |
(tween { | |
:local {:scale (v3 2.0 2.0 2.0) | |
:position rp} | |
:material {:color (color 1 0 0)}} fire 0.4 :pow3) | |
;(wait (?f 0 0.2)) | |
(tween {:local { | |
:scale (v3 0)}} fire 0.4 :pow3) | |
#(do (destroy! fire) nil))))))) | |
(defpdfn die) | |
(pdfn die [a as] | |
(timeline* | |
(tween {:local {:scale (v3 0)}} a 0.5) | |
#(destroy! a))) | |
(pdfn die [a ^:ship as] (make-level)) | |
(defpdfn trigger-dispatch) | |
(pdfn trigger-dispatch [a as b bs] (log [as bs])) | |
(pdfn trigger-dispatch [a ^:damage as b ^:hp bs] | |
(splode a (int (* 0.1 (state a :damage)))) | |
(update-state! b :hp #(- % (state a :damage))) | |
(destroy! a) | |
(if (neg? (state b :hp)) | |
(die b bs))) | |
(pdfn trigger-dispatch [a ^:ship as b ^:obstacle bs] | |
(make-level)) | |
(defn on-trigger [o c] | |
(let [other (.gameObject c) | |
[a b] (mapv ->data-haver [o other])] | |
(trigger-dispatch a (state a) b (state b)))) | |
;(set-state! (the obstacle) :obstacle true) | |
(defn fire-bullet [o] | |
(let [bullet (clone! :bullet (v3+ (->v3 o) (local-direction o (v3 4 0 0))))] | |
(set! (.rotation (.transform bullet)) (.rotation (.transform o))) | |
(set-state! bullet :speed bullet-speed) | |
(set-state! bullet :bullet true) | |
(set-state! bullet :damage 20) | |
(hook+ bullet :update #'game.core/update-bullet) | |
(hook+ (first (children bullet)) :on-trigger-enter #'game.core/on-trigger) | |
(timeline* | |
(wait 10.0) | |
(tween {:local {:scale (v3 0 0 0)}} bullet 0.6) | |
#(destroy! bullet)))) | |
(defn update-hud [o] | |
(let [health-rect-tform (cmpt (the health-bar) UnityEngine.RectTransform)] | |
(set! (.sizeDelta health-rect-tform) (v2 (state o :hp) 17)))) | |
(defn update-camera [o] | |
(let [target (the cam-target)] | |
(position! o (lerp (->v3 o) (->v3 target) 0.1)) | |
(set! (.rotation (.transform o)) | |
(Quaternion/Lerp (.rotation (.transform o)) | |
(.rotation (.transform target)) | |
0.15)))) | |
(defn populate-level [] | |
(let [obstacles (every obstacle-spawn)] | |
(mapv | |
#(let [ob (clone! :obstacle (->v3 %))] | |
(set-rotation! ob %)) | |
obstacles) | |
nil)) | |
(defn make-level [] | |
(clear-cloned!) | |
(clone! :sun1) | |
(clone! :sun2) | |
(clone! :EventSystem) | |
(clone! :Canvas) | |
(let [p (clone! :planet3) | |
spawn (first (children p)) | |
s (clone! :ship (->v3 spawn)) | |
cam (clone! :camera)] | |
(set-rotation! s spawn) | |
(set-state! s :speed speed) | |
(set-state! s :ship true) | |
(set-state! s :hp 200) | |
(set-state! s :max-hp 200) | |
(timeline* (wait 0.0) #(populate-level)) | |
(timeline* :loop | |
#(if (key? "space") | |
(do (fire-bullet s) false) | |
true) | |
(wait 0.2)) | |
(hook+ s :update #'game.core/update-ship) | |
(hook+ s :update #'game.core/update-hud) | |
(hook+ cam :update #'game.core/update-camera) | |
(hook+ s :on-trigger-enter #'game.core/on-trigger))) | |
(make-level) | |
;TODO | |
'([x] camera system) | |
'([x] collisions | |
([x] collision dispatch pdfn) | |
([x] generic :hp :bullet method)) | |
'([ ] planetoid spawn points #{:obstacle :enemy} | |
([ ] generated spawn points?)) | |
'([ ] fix planetoid constraints | |
([ ] step algo based on speed)) | |
'([ ] enemy types) | |
'([ ] menu) | |
'([ ] HUD | |
([x] lifebar) | |
([ ] :score :level-time :enemies-left)) | |
'([ ] sfx | |
([ ] game events) | |
([ ] music)) |
Author
selfsame
commented
Aug 9, 2016
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment