Created
August 5, 2016 22:24
-
-
Save selfsame/fef4af77b96619fae049b04510fff051 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)) | |
(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