From d4c537e6ab543f79b25f2d7ea90f24cda8c426bf Mon Sep 17 00:00:00 2001 From: nephryte Date: Sun, 26 May 2024 00:34:23 -0400 Subject: [PATCH] Add physics engine --- modules/ces/component/acceleration.scm | 38 ++++++++++++++++++++ modules/ces/component/level.scm | 15 -------- modules/ces/component/player.scm | 9 ----- modules/ces/component/position.scm | 6 ++-- modules/ces/component/room.scm | 15 -------- modules/ces/component/velocity.scm | 32 ++++++++++++++--- modules/ces/system/physics-engine.scm | 47 +++++++++++++++++++++++++ modules/ces/system/tilemap-renderer.scm | 1 - 8 files changed, 116 insertions(+), 47 deletions(-) create mode 100644 modules/ces/component/acceleration.scm delete mode 100644 modules/ces/component/level.scm delete mode 100644 modules/ces/component/player.scm delete mode 100644 modules/ces/component/room.scm create mode 100644 modules/ces/system/physics-engine.scm diff --git a/modules/ces/component/acceleration.scm b/modules/ces/component/acceleration.scm new file mode 100644 index 0000000..7f11807 --- /dev/null +++ b/modules/ces/component/acceleration.scm @@ -0,0 +1,38 @@ +(define-module (ces component acceleration) + #:pure + #:use-module (scheme base) + #:use-module (math vector) + #:export (acceleration? + acceleration-entity-id + make-acceleration + create-acceleration + acceleration-x + acceleration-y + set-acceleration + set-acceleration!)) + +(define-record-type + (make-acceleration entity-id acc-vec) + acceleration? + (entity-id acceleration-entity-id) + (acc-vec acceleration-vector)) + +(define (create-acceleration entity-id x y) + (make-acceleration entity-id + (vec2 x y))) + +(define (acceleration-x acceleration) + (vec2-x (acceleration-vector acceleration))) + +(define (acceleration-y acceleration) + (vec2-y (acceleration-vector acceleration))) + +(define (set-acceleration acceleration x y) + "Creates a copy of the acceleration component with the given x and y" + (create-acceleration (acceleration-entity-id acceleration) x y)) + +(define (set-acceleration! acceleration x y) + "Sets the coordinates of the given acceleration component" + (begin + (set-vec2-x! (acceleration-vector acceleration) x) + (set-vec2-y! (acceleration-vector acceleration) y))) diff --git a/modules/ces/component/level.scm b/modules/ces/component/level.scm deleted file mode 100644 index c16d7b1..0000000 --- a/modules/ces/component/level.scm +++ /dev/null @@ -1,15 +0,0 @@ -(define-module (ces component level) - #:pure - #:use-module (scheme base) - #:export (level? - make-level - level-entity-id - level-rooms)) - -(define-record-type - (make-level entity-id rooms) - level? - (entity-id level-entity-id) - (rooms level-rooms)) - - diff --git a/modules/ces/component/player.scm b/modules/ces/component/player.scm deleted file mode 100644 index 76ad588..0000000 --- a/modules/ces/component/player.scm +++ /dev/null @@ -1,9 +0,0 @@ -(define-module (ces component player) - #:pure - #:use-module (scheme base)) - -;; Player is a mostly empty component, used for tagging an entity for player systems -(define-record-type - (make-player entity-id) - player? - (entity-id player-entity-id)) diff --git a/modules/ces/component/position.scm b/modules/ces/component/position.scm index 4fd84f0..889deb8 100644 --- a/modules/ces/component/position.scm +++ b/modules/ces/component/position.scm @@ -4,6 +4,7 @@ #:use-module (math vector) #:export (position? position-entity-id + make-position create-position position-x position-y @@ -11,14 +12,13 @@ set-position!)) (define-record-type - (make-position type entity-id pos-vec) + (make-position entity-id pos-vec) position? - (type position-type) (entity-id position-entity-id) (pos-vec position-vector)) (define (create-position entity-id x y) - (make-position 'position entity-id + (make-position entity-id (vec2 x y))) (define (position-x position) diff --git a/modules/ces/component/room.scm b/modules/ces/component/room.scm deleted file mode 100644 index 870f41e..0000000 --- a/modules/ces/component/room.scm +++ /dev/null @@ -1,15 +0,0 @@ -(define-module (ces component room) - #:pure - #:use-module (scheme base) - #:export (room? - make-room - room-entity-id - room-background - room-game-objects)) - -(define-record-type - (make-room entity-id background game-objects) - room? - (room-id room-entity-id) - (background room-background) - (game-objects room-game-objects)) \ No newline at end of file diff --git a/modules/ces/component/velocity.scm b/modules/ces/component/velocity.scm index 7563e29..677616a 100644 --- a/modules/ces/component/velocity.scm +++ b/modules/ces/component/velocity.scm @@ -4,11 +4,35 @@ #:use-module (math vector) #:export (velocity? velocity-entity-id - velocity-vector - set-velocity-vector!)) + make-velocity + create-velocity + velocity-x + velocity-y + set-velocity + set-velocity!)) (define-record-type - (make-velocity entity-id velocity-vec) + (make-velocity entity-id vel-vec) velocity? (entity-id velocity-entity-id) - (velocity-vec velocity-vector set-velocity-vector!)) + (vel-vec velocity-vector)) + +(define (create-velocity entity-id x y) + (make-velocity entity-id + (vec2 x y))) + +(define (velocity-x velocity) + (vec2-x (velocity-vector velocity))) + +(define (velocity-y velocity) + (vec2-y (velocity-vector velocity))) + +(define (set-velocity velocity x y) + "Creates a copy of the velocity component with the given x and y" + (create-velocity (velocity-entity-id velocity) x y)) + +(define (set-velocity! velocity x y) + "Sets the coordinates of the given velocity component" + (begin + (set-vec2-x! (velocity-vector velocity) x) + (set-vec2-y! (velocity-vector velocity) y))) diff --git a/modules/ces/system/physics-engine.scm b/modules/ces/system/physics-engine.scm new file mode 100644 index 0000000..f1371fd --- /dev/null +++ b/modules/ces/system/physics-engine.scm @@ -0,0 +1,47 @@ +(define-module (ces system tilemap-renderer) + #:pure + #:use-module (scheme base) + #:use-module (math vector) + #:use-module (ces system) + #:use-module (ces component) + #:use-module (ces entity) + #:export (create-physics-engine)) + +;(define desired-components '('imass 'position 'velocity 'acceleration)) +(define desired-components '('position 'velocity 'acceleration)) + +(define (wants-entity? entity) + (and (game-entity? entity) + (apply has-components? desired-components))) + +(define (update-physics-entity entity dt) + ;; do math + (let ((imass (get-component entity 'imass)) + (id (game-entity-id entity))) + (if (positive? imass) + (let* ( + (friction 0.75) + ;(imass (get-component entity 'imass)) + (imass 1.0) + (pos (get-component entity 'position)) + (vel (get-component entity 'velocity)) + (acc (get-component entity 'acceleration)) + (p (position-vector pos)) + (v (velocity-vector vel)) + (a (velocity-vector acc)) + (p* (vec2-add! p (vec2-mul-scalar! v dt))) + (v* (vec2-mul-scalar! (vec2-add! v (vec2-mul-scalar! a dt)) (* friction dt))) + ) + ;; update component(s) + (let* ((updated-entity (set-component entity 'position (make-position id p*))) + (updated-entity (set-component entity 'velocity (make-velocity id v*))))) + ;; reset entity + (reset-entity! (get-entity-manager) updated-entity) + ) + + ))) + +(define (create-physics-engine) + (create-system wants-entity? + (lambda (entity dt) + (update-physics-entity entity dt)))) \ No newline at end of file diff --git a/modules/ces/system/tilemap-renderer.scm b/modules/ces/system/tilemap-renderer.scm index 25177b3..5df643b 100644 --- a/modules/ces/system/tilemap-renderer.scm +++ b/modules/ces/system/tilemap-renderer.scm @@ -36,7 +36,6 @@ (y (+ y-offset (* (modulo index tl-height) ts-tile-height)))) (renderer img x y tile-width tile-height))) data))) tm-layers)))) - (define (create-tilemap-renderer renderer) (create-system wants-entity? (lambda (entity dt)