Skip to content

Instantly share code, notes, and snippets.

@selfsame
Created August 5, 2016 22:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save selfsame/fef4af77b96619fae049b04510fff051 to your computer and use it in GitHub Desktop.
Save selfsame/fef4af77b96619fae049b04510fff051 to your computer and use it in GitHub Desktop.
(ns game.core
(:use
arcadia.core
arcadia.linear
tween.core
hard.core
hard.input))
(declare fire-bullet)
(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 planet? [o]
(re-find #"planet" (.name o)))
(defn ship-keys [o]
(cond
(key? "a") (rotate! o (v3 0 -1.5 0))
(key? "d") (rotate! o (v3 0 1.5 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 fire-bullet [o]
(let [bullet (clone! :bullet (v3+ (->v3 o) (local-direction o (v3 3 0 0))))]
(set! (.rotation (.transform bullet)) (.rotation (.transform o)))
(set-state! bullet :speed bullet-speed)
(hook+ bullet :update #'game.core/update-bullet)
(timeline*
(wait 10.0)
(tween {:local {:scale (v3 0 0 0)}} bullet 0.6)
#(destroy! bullet))))
(defn make-level []
(clear-cloned!)
(clone! :sun1)
(clone! :sun2)
(let [p (clone! :planet3)
spawn (first (children p))
s (clone! :ship (->v3 spawn))]
(set-state! s :fire-cooldown 0.0)
(set-state! s :speed speed)
(timeline* :loop
#(if true #_(key? "space")
(do (fire-bullet s) false)
true)
(wait 0.2))
#_(dorun (for [i (range 60)]
(clone! :Sphere (?on-sphere 10.0))))
(hook+ s :update #'game.core/update-ship)))
(make-level)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment