]> git.jsancho.org Git - guile-irrlicht.git/commitdiff
Movement example
authorJavier Sancho <jsf@jsancho.org>
Thu, 16 Apr 2020 18:40:20 +0000 (20:40 +0200)
committerJavier Sancho <jsf@jsancho.org>
Thu, 16 Apr 2020 18:40:20 +0000 (20:40 +0200)
examples/04.Movement.scm [new file with mode: 0644]
examples/media/irrlichtlogoalpha2.tga [new file with mode: 0644]
examples/media/ninja.b3d [new file with mode: 0644]
examples/media/nskinbl.jpg [new file with mode: 0644]
examples/media/t351sml.jpg [new file with mode: 0644]
examples/media/wall.bmp [new file with mode: 0644]

diff --git a/examples/04.Movement.scm b/examples/04.Movement.scm
new file mode 100644 (file)
index 0000000..3850079
--- /dev/null
@@ -0,0 +1,157 @@
+;;; guile-irrlicht --- FFI bindings for Irrlicht Engine
+;;; Copyright (C) 2020 Javier Sancho <jsf@jsancho.org>
+;;;
+;;; This file is part of guile-irrlicht.
+;;;
+;;; Guile-irrlicht is free software; you can redistribute it and/or modify
+;;; it under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation; either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; Guile-irrlicht is distributed in the hope that it will be useful, but
+;;; WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+;;; General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with guile-irrlicht.  If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+
+;;; Irrlicht 04.Movement example
+;;; http://irrlicht.sourceforge.net/docu/example004.html
+
+
+(use-modules (irrlicht)
+             (ice-9 match))
+
+;; ask user for driver
+(format #t
+        "Please select the driver you want for this example:
+ (a) OpenGL 1.5
+ (b) Direct3D 9.0c
+ (c) Direct3D 8.1
+ (d) Burning's Software Renderer
+ (e) Software Renderer
+ (f) NullDevice
+ (otherKey) exit~%~%")
+
+(define device-type (match (read-char)
+                           (#\a 'opengl)
+                           (#\b 'direct3d9)
+                           (#\c 'direct3d8)
+                           (#\d 'burnings)
+                           (#\e 'software)
+                           (#\f 'null)
+                           (_ #f)))
+
+(when (not device-type)
+  (exit #f))
+
+;; create event receiver
+(define key-is-down '())
+(define (is-key-down? key-code)
+  (assoc-ref key-is-down key-code))
+
+(define (on-event event)
+  (if (equal? (event-type event) 'key-input-event)
+      (set! key-is-down
+            (assoc-set! key-is-down
+                        (event-key-input-key event)
+                        (event-key-input-pressed event))))
+  #f)
+
+(define receiver (make-event-receiver on-event))
+
+;; create device
+(define device
+  (create-device
+   #:device-type device-type
+   #:window-size '(640 480)
+   #:receiver receiver))
+(when (not device)
+  (exit #f))
+
+(define driver (get-video-driver device))
+(define scene-manager (get-scene-manager device))
+(define gui-env (get-gui-environment device))
+
+;; create the node which will be moved with the WSAD keys
+(define wall (add-sphere-scene-node! scene-manager))
+(set-position! wall '(0 0 30))
+(set-material-texture! wall 0 (get-texture driver "media/wall.bmp"))
+(set-material-flag! wall 'lighting #f)
+
+;; create another node, movable using a scene node animator
+(let ((cube (add-cube-scene-node! scene-manager))
+      (anim (create-fly-circle-animator scene-manager #:center '(0 0 30))))
+  (set-material-texture! cube 0 (get-texture driver "media/t351sml.jpg"))
+  (set-material-flag! cube 'lighting #f)
+  (add-animator! cube anim)
+  (drop! anim))
+
+;; another scene with a b3d model and a 'fly straight' animator
+(let ((ninja (add-animated-mesh-scene-node!
+              scene-manager (get-mesh scene-manager "media/ninja.b3d")))
+      (anim (create-fly-straight-animator
+             scene-manager '(100 0 60) '(-100 0 60) 3500 #:loop #t)))
+  (add-animator! ninja anim)
+  (drop! anim)
+
+  ;; make the model look right
+  (set-material-flag! ninja 'lighting #f)
+  (set-frame-loop! ninja 0 13)
+  (set-animation-speed! ninja 15)
+  (set-scale! ninja '(2 2 2))
+  (set-rotation! ninja '(0 -90 0)))
+
+;; create a first person shooter camera
+(add-camera-scene-node-fps! scene-manager)
+(set-visible! (get-cursor-control device) #f)
+
+;; colorful irrlicht logo
+(add-image! gui-env (get-texture driver "media/irrlichtlogoalpha2.tga") '(10 20))
+(let ((diagnostics (add-static-text! gui-env "" '(10 10 400 20))))
+  (set-override-color! diagnostics '(255 255 255 0)))
+
+;; game loop
+(let ((timer (get-timer device))
+      (driver-name (get-name driver)))
+  (let ((last-fps -1)
+        (then (get-time timer))
+        (movement-speed 5))
+    (while (run device)
+      (let* ((now (get-time timer))
+             (frame-delta-time (/ (- now then) 1000)))
+        (set! then now)
+
+        ;; check if W, S, A or D are pressed
+        (let* ((node-position (get-position wall))
+               (pos-x (car node-position))
+               (pos-y (cadr node-position))
+               (pos-z (caddr node-position)))
+          (if (is-key-down? 'key-w)
+              (set! pos-y (+ pos-y (* movement-speed frame-delta-time))))
+          (if (is-key-down? 'key-s)
+              (set! pos-y (- pos-y (* movement-speed frame-delta-time))))
+          (if (is-key-down? 'key-a)
+              (set! pos-x (- pos-x (* movement-speed frame-delta-time))))
+          (if (is-key-down? 'key-d)
+              (set! pos-x (+ pos-x (* movement-speed frame-delta-time))))
+          (set-position! wall (list pos-x pos-y pos-z))))
+
+      (begin-scene driver #:color '(255 113 113 133))
+      (draw-all scene-manager)
+      (draw-all gui-env)
+      (end-scene driver)
+
+      (let ((fps (get-fps driver)))
+        (when (not (= last-fps fps))
+          (let ((caption
+                 (format #f "Movement Example - Irrlicht Engine [~a] fps: ~a" driver-name fps)))
+            (set-window-caption! device caption))
+          (set! last-fps fps))))))
+
+;; delete device
+(drop! device)
+(exit #t)
diff --git a/examples/media/irrlichtlogoalpha2.tga b/examples/media/irrlichtlogoalpha2.tga
new file mode 100644 (file)
index 0000000..faa6c1a
Binary files /dev/null and b/examples/media/irrlichtlogoalpha2.tga differ
diff --git a/examples/media/ninja.b3d b/examples/media/ninja.b3d
new file mode 100644 (file)
index 0000000..fbc7872
Binary files /dev/null and b/examples/media/ninja.b3d differ
diff --git a/examples/media/nskinbl.jpg b/examples/media/nskinbl.jpg
new file mode 100644 (file)
index 0000000..b701adb
Binary files /dev/null and b/examples/media/nskinbl.jpg differ
diff --git a/examples/media/t351sml.jpg b/examples/media/t351sml.jpg
new file mode 100644 (file)
index 0000000..e3561f3
Binary files /dev/null and b/examples/media/t351sml.jpg differ
diff --git a/examples/media/wall.bmp b/examples/media/wall.bmp
new file mode 100644 (file)
index 0000000..ff1a8c1
Binary files /dev/null and b/examples/media/wall.bmp differ