/
core.clj
87 lines (73 loc) · 2.67 KB
/
core.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
(ns game.core
(:require
[godotclj.api :as api :refer [->object]]
[godotclj.connect :as connect]
[godotclj.core]))
(def Input (->object "Input"))
(def player-velocity 300) ;; px/s
(def gravity 1000) ;; px/s^2
(def jump-velocity 500)
(def coyote-time 0.02)
(def max-level-count 3)
(def current-velocity (atom [0 0]))
(def coyote-time-counter (atom 0))
(def current-level (atom 1))
(defn- get-x-direction []
(- (.getActionStrength Input "ui_right")
(.getActionStrength Input "ui_left")))
(defn can-jump? [body]
(or (.isOnFloor body)
(< @coyote-time-counter coyote-time)))
(defn set-current-velocity [x y]
(swap! current-velocity #(vector (or x (first %)) (or y (second %)))))
(defn physics-process [level delta]
(let [player (.getNode level "Player")]
(set-current-velocity (* (get-x-direction) player-velocity) nil)
(if (.isOnFloor player)
(reset! coyote-time-counter 0)
(swap! coyote-time-counter + delta))
(set-current-velocity
nil
(if (and (.isActionJustPressed Input "ui_up")
(can-jump? player))
(- jump-velocity)
(+ (second @current-velocity)
(* gravity delta))))
(.moveAndSlide player (api/vec2 @current-velocity) (api/vec2 [0 -1]))))
(defn get-root []
(.getRoot (.getMainLoop (->object "_Engine"))))
(defn load-level [n]
(.changeScene (.getTree (get-root))
(format "res://scenes/levels/Level%s.tscn" n)))
(defn main-ready [this]
(println "Game has started")
(godotclj.core/connect (.getNode this "CenterContainer/StartButton")
"pressed"
(fn [_] (load-level 1))))
(defn on-finish-flag-area-entered [_ _]
(println "Level has been completed!")
(if (<= (inc @current-level) max-level-count)
(do (swap! current-level inc)
(godotclj.core/defer #(load-level @current-level)))
(println "All levels have been completed!")))
(defn level-ready [this]
(let [node (.getNode this "FinishFlag")]
(godotclj.core/connect node
"body_entered"
on-finish-flag-area-entered)
;;; Testing disconnect
(godotclj.core/disconnect node "body_entered")
(godotclj.core/connect node
"body_entered"
on-finish-flag-area-entered)))
(defn init!
[p-handle]
(godotclj.core/init! p-handle)
(connect/init!)
(doto "StartMenu"
(godotclj.core/register-class! "Node2D")
(godotclj.core/register-method! "_ready" main-ready))
(doto "BaseLevel"
(godotclj.core/register-class! "Node2D")
(godotclj.core/register-method! "_ready" level-ready)
(godotclj.core/register-method! "_physics_process" physics-process)))