Skip to content

Instantly share code, notes, and snippets.

@selfsame
Created April 6, 2015 10:49
Show Gist options
  • Select an option

  • Save selfsame/815249abf4961b4f3a04 to your computer and use it in GitHub Desktop.

Select an option

Save selfsame/815249abf4961b4f3a04 to your computer and use it in GitHub Desktop.
(ns farm.platformer
(:use hard.core hard.input hard.physics hard.edit)
(:require [tween.core :as tween])
(:import [UnityEngine]))
(def player (atom nil))
(def grounded (atom false))
(def mouse (atom [0 0 0]))
(def >die (tween/scale (->v3 0 0 0) 0.01 #(destroy! %)))
(defcomponent living [^System.Double hp ^System.Double max])
(defn jump []
(when @grounded
(force! (->rigidbody @player) 0 2000 0)))
(defn walk [axis]
(when true ;@grounded
(let [[x y z] (->vec (inverse-transform-point (->transform @player)
(V+ (->v3 @player)(->v3 axis 0 0))))]
(force! (->rigidbody @player) (float (* x 100)) y z))))
(defn set-text [go s]
(set! (.* go>TextMesh.text) s))
(defn euler-flop [n]
(? (> n 180) (- 360 n)
(< n -180) (+ 360 n)
:else n))
(defn update-actor [go]
(let [vel (->velocity go)
avel (.* go>Rigidbody.angularVelocity)
balance (map euler-flop (v- (->v3 0 0 0) (v+ (rotation go) (V* avel 40))))]
(apply torque! (cons (->rigidbody go) (->vec balance )))))
(defn update-player [player]
(let [[arm debug hand] (child-named player "arm" "debug" "hand")]
(look-at! arm @mouse [0 1 0])
(set-text debug (str "player"))
(mapv update-actor (objects-named "player"))
(when (mouse-down?)
(let [tar (V- (->v3 hand)(->v3 arm))
bullet (clone! :levels:bullet (->v3 hand))
>bdie (assoc >die :duration 1)]
(>bdie bullet)
(! (->rigidbody bullet) velocity (V* tar 20)) ))))
(defn game-update [d]
(route key?
"a" (walk -1)
"d" (walk 1))
(route key-down?
"space" (jump))
(update-player @player)
(when-let [hit (first (vec (ray-hits (mouse-ray) 5000)))]
(let [[x y z] (->vec (.point hit))]
(position! (find-name "mousepoint") [x y 0])
(reset! mouse [x y 0]) )))
(defn game-start [_]
(clear-cloned)
(clone! :levels:01)
(clone! :levels:camera)
(clone! :levels:mousepoint)
(reset! player (clone! :levels:player))
(clone! :levels:player [4 0 -4]))
(defn ground-enter [this c] (reset! grounded true))
(defn ground-exit [this c] (reset! grounded false))
(defn damage [go n]
(when-let [c (.* go>living)]
(! c hp (- (.hp c) n))))
(defn bullet-hit [this c]
(let [hit (.gameObject c)
contacts (.contacts c)
>pdie (assoc >die :duration 1.0)]
(damage hit 10.0)
(>pdie (clone! :levels:sparks (.point (first contacts))))
(>die this)))
(game-start nil)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment