From: Javier Sancho Date: Thu, 16 Apr 2020 18:40:20 +0000 (+0200) Subject: Movement example X-Git-Url: https://git.jsancho.org/?p=guile-irrlicht.git;a=commitdiff_plain;h=70aa0b0ae288706f138a295f85c60fa6609b7198 Movement example --- diff --git a/examples/04.Movement.scm b/examples/04.Movement.scm new file mode 100644 index 0000000..3850079 --- /dev/null +++ b/examples/04.Movement.scm @@ -0,0 +1,157 @@ +;;; guile-irrlicht --- FFI bindings for Irrlicht Engine +;;; Copyright (C) 2020 Javier Sancho +;;; +;;; 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 +;;; . + + +;;; 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 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 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 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 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 index 0000000..ff1a8c1 Binary files /dev/null and b/examples/media/wall.bmp differ