The trio the author decided on 2026-09-20 is now all built: def is CL's defparameter — its initialiser runs on every daemon re-run, unguarded, so an edited initialiser repaints the same storage on C-c C-c plus re-run — defonce (Clojure's name for CL's defvar, per the author) initialises once behind the .init~once. flag, and defconst stays the image. One parse arm reads both forms; the difference is Ast.reinit, carried to Tast.global's grerun. Emit.startup_plan gives a def no guard flag, and Check.check_global lifts every def initialiser — zero and literal included — into global/<n>, so the host's startup reaches it through the function cell and a re-evaluated def swaps it (Session's def_inits; Emit.redefinition declares the cell for a non-sibling target). The old defvar spelling is refused with the rename and both compiling spellings, and every program, test, doc and editor list is swept — except sand.flan, the author's live WIP, whose seven defvar lines are flagged in FIX.org and keep its three dependent tests red on this branch.
69 lines
3.0 KiB
Plaintext
69 lines
3.0 KiB
Plaintext
;;;; raylib [core] example - input multitouch
|
|
;;;;
|
|
;;;; examples/core/core_input_multitouch.c. No new bindings: the whole touch
|
|
;;;; surface was already there for sand.flan's read-out.
|
|
;;;;
|
|
;;;; The C keeps `Vector2 touchPositions[MAX_TOUCH_POINTS]`, and this is the
|
|
;;;; first example that needs a fixed array whose element type is a STRUCT
|
|
;;;; rather than a number. That works — `[10 rl/Vector2]` is ten Vector2s laid
|
|
;;;; out flat, no headers, and `(at touch-positions i)` is a place that can be
|
|
;;;; assigned a whole struct. Nothing in the repository used one before, so it
|
|
;;;; is worth saying that it does.
|
|
;;;;
|
|
;;;; It is a top-level `defonce` and not a local, which is NOT a stylistic
|
|
;;;; choice. A `let` binding takes no type annotation, so the only way to make
|
|
;;;; a fixed array inside a function is to initialise it from a literal with
|
|
;;;; every element written out — ten `(rl/Vector2 {.x 0.0 .y 0.0})`s here, and
|
|
;;;; thirty-two in the gestures testbed. A zeroed local array of a given type
|
|
;;;; cannot be spelled. Static storage is what the C's `= { 0 }` gets anyway.
|
|
;;;;
|
|
;;;; On a desktop with no touchscreen get-touch-point-count is 0 and this draws
|
|
;;;; nothing at all, which is correct and is also what the C does. The window
|
|
;;;; opening and the help text appearing is the whole of what can be checked
|
|
;;;; without hardware.
|
|
|
|
(import rl "vendor:raylib")
|
|
|
|
(defconst screen-width 800)
|
|
(defconst screen-height 450)
|
|
|
|
(defconst max-touch-points 10)
|
|
|
|
(defonce touch-positions [max-touch-points rl/Vector2])
|
|
|
|
(defn main [] ()
|
|
(rl/init-window screen-width screen-height
|
|
"raylib [core] example - input multitouch")
|
|
(defer (rl/close-window))
|
|
|
|
(rl/set-target-fps 60)
|
|
|
|
(until (rl/window-should-close?)
|
|
;; Update
|
|
(let [count (min max-touch-points (rl/get-touch-point-count))]
|
|
(dotimes [i count]
|
|
(set (at touch-positions i) (rl/get-touch-position i)))
|
|
|
|
;; Draw
|
|
(rl/with-drawing
|
|
(rl/clear-background rl/raywhite)
|
|
|
|
(dotimes [i count]
|
|
(let [p (at touch-positions i)]
|
|
;; raylib reports (0,0) for a slot that is not being touched, so the
|
|
;; C filters on it and so does this. It means a real touch in the
|
|
;; very top-left corner is dropped; that is raylib's ambiguity, not
|
|
;; something the port introduced.
|
|
(when (and (> (.x p) 0.0) (> (.y p) 0.0))
|
|
(rl/draw-circle-v p 34.0 rl/orange)
|
|
;; The C's TextFormat("%d", i). This used to need examples/digits.flan
|
|
;; and a table of one-character strings; (string b) makes the
|
|
;; number a string with no instructions, so it is one draw-text and
|
|
;; this file imports nothing but raylib.
|
|
(rl/draw-text (string (i64->bytes (i64 i)))
|
|
(- (i32 (.x p)) 10) (- (i32 (.y p)) 70) 40
|
|
rl/black))))
|
|
|
|
(rl/draw-text "touch the screen at multiple locations to get multiple balls"
|
|
10 10 20 rl/darkgray)))))
|