diff --git a/engine.lisp b/engine.lisp index 5a92c59..fb538fc 100644 --- a/engine.lisp +++ b/engine.lisp @@ -2,26 +2,31 @@ (defclass engine-object (game-object) ((start-time :initarg :start-time :accessor start-time :initform 0) + ;; time till fully active (activation-time :initarg :activation-time :accessor activation-time :initform 0))) +(defmethod activate ((object engine-object) start-time) + (setf (start-time object) start-time)) + (defclass engine-model (model) ((template-vertices :initarg :template-vertices :accessor template-vertices :initform nil) (template-colors :initarg :template-colors :accessor template-colors :initform nil))) (defun generate-step-2d-array (2darr time) (let ((len-arr (length 2darr)) - (len-row (length (aref 2darr 0)))) + (len-row (length (first 2darr)))) (make-2d-array len-arr len-row - (loop for i from 0 to len-arr collecting - (loop for j from 0 to len-row collecting - (let ((item (aref (aref 2darr i) j))) - (if (listp item) - (converge (first item) (second item) (third item) time) - item))))))) + (loop for row in 2darr collecting + (loop for item in row collecting + ;(let ((item (aref (aref 2darr i) j))) + (if (listp item) + (converge (first item) (second item) (third item) time) + item)))))) ; take 2 seconds to fully fire (defmethod regen-model ((model engine-model) time) + (format t "REGNE MODEL~%") (setf (vertices model) (generate-step-2d-array (template-vertices model) time)) (setf (colors model) (generate-step-2d-array (template-colors model) time))) @@ -38,9 +43,9 @@ ((0 255 2) (0 255 2) (64 255 2)))) -(defmethod draw ((model engine-model) time) - (if (and (generated-model model) (< (- time (start-time model)) (activation-time model))) - (regen-model model time)) +(defmethod draw ((object engine-object) time) + (if (< (- time (start-time object)) (activation-time object)) + (regen-model (model object) time)) (call-next-method)) diff --git a/flight-sim.lisp b/flight-sim.lisp index 8aff019..f624aa6 100644 --- a/flight-sim.lisp +++ b/flight-sim.lisp @@ -147,7 +147,8 @@ (defun thruster-on (key) (case key - ; ((:sdl-key-w) ; + z + ((:sdl-key-w) ; + z + (activate-attachment *self* :thruster (wall-time))) ; (progn ;(setf (aref (acceleration (motion *self*)) 2) (- *acceleration*)) ;(engine-start (engine *self*) (wall-time)))) @@ -167,7 +168,8 @@ (defun thruster-off (key) (case key - ;((:sdl-key-w) ; + z + ((:sdl-key-w) ; + z + (deactivate-attachment *self* :thruster)) ; (progn ; (setf (aref (acceleration (motion *self*)) 2) 0) ; (engine-stop (engine *self*)))) @@ -256,13 +258,12 @@ :attachments (list :thruster (make-instance 'engine-object + :activation-time 2 :model (make-instance 'engine-model :template-vertices *thruster-vertices* :template-colors *thruster-colors*) :body (make-instance 'body - :coords (vector 0 0 3))))))) - - + :coords (vector 0 0 3)))))) ;:engines (list :engines (list :thrust ; (make-instance 'engine-object ; :motion (make-instance 'motion :coords (vector 0 0.5 3.0)) diff --git a/objects.lisp b/objects.lisp index 71493ad..538b1c5 100644 --- a/objects.lisp +++ b/objects.lisp @@ -12,10 +12,19 @@ ;(defmethod coords ((object game-object)) ; (coords (body object))) -(defmethod activate ((object game-object) sym start-time) +(defgeneric activate (object start-time)) +(defgeneric activate-attachment (object sym start-time)) + +(defgeneric deactivate (object)) +(defgeneric deactivate-attachment (object sym)) + +(defmethod activate-attachment ((object game-object) sym start-time) (push sym (active-attachments object)) (activate (getf (attachments object) sym) start-time)) +(defmethod deactivate-attachment ((object game-object) sym) + (setf (active-attachments object) (remove sym (active-attachments object)))) + (defmethod draw :before ((object game-object) time) (gl:push-matrix) (gl:translate (aref (coords (body object)) 0) (aref (coords (body object)) 1) (aref (coords (body object)) 2)) @@ -27,4 +36,6 @@ (gl:pop-matrix)) (defmethod draw ((object game-object) time) - (draw (model object) time)) + (draw (model object) time) + (loop for a in (active-attachments object) do + (draw (getf (attachments object) a) time)))