From 81e986fadf93b21ef46b48765658abcdb4ac5977 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sat, 4 Apr 2020 21:00:32 -0700 Subject: [PATCH] Overhaul the Platformer Physics System * Player character now experiences acceleration and friction when walking around the map! * Actor position and movement had to be converted from int's (render.Point) to float64's to support fine-grained acceleration steps. * Added "physics" package and physics.Vector to be a float64 counterpart for render.Point. Vector is used for uix.Actor.Position() for the sake of movement math. Vector is flattened back to a render.Point for collision purposes, since the levels and hitboxes are pixel-bound. * Refactor the uix.Actor to no longer extend the doodads.Drawing (so it can have a Position that's a Vector instead of a Point). This broke some code that expected `.Doodad` to directly reference the Drawing.Doodad: now you had to refer to it as `a.Drawing.Doodad` which was ugly. Added convenience method .Doodad() for a shortcut. * Moved functions like GetBoundingRect() from doodads package to collision, where it uses its own slimmer Actor interface for just the relevant methods it needs. --- dev-assets/doodads/azulian/azulian-red.js | 8 +++++--- dev-assets/doodads/buttons/button.js | 4 ++-- dev-assets/doodads/buttons/sticky.js | 2 +- dev-assets/doodads/doors/colored-door.js | 2 +- dev-assets/doodads/doors/electric-door.js | 4 ++-- dev-assets/doodads/doors/keys.js | 4 ++-- dev-assets/doodads/doors/locked-door.js | 2 +- dev-assets/doodads/mischievous.js | 2 +- dev-assets/doodads/objects/exit-flag.js | 2 +- dev-assets/doodads/on-off/state-button.js | 2 +- dev-assets/doodads/switches/switch.js | 2 +- dev-assets/doodads/trapdoors/down.js | 2 +- dev-assets/doodads/trapdoors/trapdoor.js | 2 +- 13 files changed, 20 insertions(+), 18 deletions(-) diff --git a/dev-assets/doodads/azulian/azulian-red.js b/dev-assets/doodads/azulian/azulian-red.js index f631e40..ca87ff3 100644 --- a/dev-assets/doodads/azulian/azulian-red.js +++ b/dev-assets/doodads/azulian/azulian-red.js @@ -1,5 +1,5 @@ function main() { - log.Info("Azulian '%s' initialized!", Self.Doodad.Title); + log.Info("Azulian '%s' initialized!", Self.Doodad().Title); var playerSpeed = 4; var gravity = 4; @@ -28,8 +28,10 @@ function main() { } sampleTick++; - var Vx = playerSpeed * (direction === "left" ? -1 : 1); - Self.SetVelocity(Point(Vx, 0)); + // TODO: Vector() requires floats, pain in the butt for JS, + // the JS API should be friendlier and custom... + var Vx = parseFloat(playerSpeed * (direction === "left" ? -1 : 1)); + Self.SetVelocity(Vector(Vx, 0.0)); if (!Self.IsAnimating()) { Self.PlayAnimation("walk-"+direction, null); diff --git a/dev-assets/doodads/buttons/button.js b/dev-assets/doodads/buttons/button.js index 7e48193..976c2d6 100644 --- a/dev-assets/doodads/buttons/button.js +++ b/dev-assets/doodads/buttons/button.js @@ -1,5 +1,5 @@ function main() { - console.log("%s initialized!", Self.Doodad.Title); + console.log("%s initialized!", Self.Doodad().Title); var timer = 0; @@ -28,7 +28,7 @@ function main() { }); // Events.OnLeave(function(e) { - // console.log("%s has stopped touching %s", e, Self.Doodad.Title) + // console.log("%s has stopped touching %s", e, Self.Doodad().Title) // Self.Canvas.SetBackground(RGBA(0, 0, 1, 0)); // }) } diff --git a/dev-assets/doodads/buttons/sticky.js b/dev-assets/doodads/buttons/sticky.js index ed4113d..8750fad 100644 --- a/dev-assets/doodads/buttons/sticky.js +++ b/dev-assets/doodads/buttons/sticky.js @@ -1,5 +1,5 @@ function main() { - console.log("%s initialized!", Self.Doodad.Title); + console.log("%s initialized!", Self.Doodad().Title); var pressed = false; diff --git a/dev-assets/doodads/doors/colored-door.js b/dev-assets/doodads/doors/colored-door.js index 48015d8..a221b58 100644 --- a/dev-assets/doodads/doors/colored-door.js +++ b/dev-assets/doodads/doors/colored-door.js @@ -1,6 +1,6 @@ function main() { - var color = Self.Doodad.Tag("color"); + var color = Self.Doodad().Tag("color"); var keyname = "key-" + color + ".doodad"; // Layers in the doodad image. diff --git a/dev-assets/doodads/doors/electric-door.js b/dev-assets/doodads/doors/electric-door.js index 9aa75af..ab6dc54 100644 --- a/dev-assets/doodads/doors/electric-door.js +++ b/dev-assets/doodads/doors/electric-door.js @@ -1,5 +1,5 @@ function main() { - console.log("%s initialized!", Self.Doodad.Title); + console.log("%s initialized!", Self.Doodad().Title); Self.AddAnimation("open", 100, [0, 1, 2, 3]); Self.AddAnimation("close", 100, [3, 2, 1, 0]); @@ -9,7 +9,7 @@ function main() { Self.SetHitbox(16, 0, 32, 64); Message.Subscribe("power", function(powered) { - console.log("%s got power=%+v", Self.Doodad.Title, powered); + console.log("%s got power=%+v", Self.Doodad().Title, powered); if (powered) { if (animating || opened) { diff --git a/dev-assets/doodads/doors/keys.js b/dev-assets/doodads/doors/keys.js index 667022e..ee7586a 100644 --- a/dev-assets/doodads/doors/keys.js +++ b/dev-assets/doodads/doors/keys.js @@ -1,9 +1,9 @@ function main() { - var color = Self.Doodad.Tag("color"); + var color = Self.Doodad().Tag("color"); Events.OnCollide(function(e) { if (e.Settled) { - e.Actor.AddItem(Self.Doodad.Filename, 0); + e.Actor.AddItem(Self.Doodad().Filename, 0); Self.Destroy(); } }) diff --git a/dev-assets/doodads/doors/locked-door.js b/dev-assets/doodads/doors/locked-door.js index 3ad7a8a..e1f9f3f 100644 --- a/dev-assets/doodads/doors/locked-door.js +++ b/dev-assets/doodads/doors/locked-door.js @@ -2,7 +2,7 @@ function main() { Self.AddAnimation("open", 0, [1]); var unlocked = false; - var color = Self.Doodad.Tag("color"); + var color = Self.Doodad().Tag("color"); Self.SetHitbox(16, 0, 32, 64); diff --git a/dev-assets/doodads/mischievous.js b/dev-assets/doodads/mischievous.js index b694f08..c7b4e0b 100644 --- a/dev-assets/doodads/mischievous.js +++ b/dev-assets/doodads/mischievous.js @@ -1,5 +1,5 @@ function main() { - console.log("%s initialized!", Self.Doodad.Title); + console.log("%s initialized!", Self.Doodad().Title); console.log(Object.keys(console)); console.log(Object.keys(log)); diff --git a/dev-assets/doodads/objects/exit-flag.js b/dev-assets/doodads/objects/exit-flag.js index df4aec0..215ad05 100644 --- a/dev-assets/doodads/objects/exit-flag.js +++ b/dev-assets/doodads/objects/exit-flag.js @@ -1,6 +1,6 @@ // Exit Flag. function main() { - console.log("%s initialized!", Self.Doodad.Title); + console.log("%s initialized!", Self.Doodad().Title); Self.SetHitbox(22+16, 16, 75-16, 86); Events.OnCollide(function(e) { diff --git a/dev-assets/doodads/on-off/state-button.js b/dev-assets/doodads/on-off/state-button.js index 8770b08..88c06ed 100644 --- a/dev-assets/doodads/on-off/state-button.js +++ b/dev-assets/doodads/on-off/state-button.js @@ -4,7 +4,7 @@ var state = false; function main() { - console.log("%s ID '%s' initialized!", Self.Doodad.Title, Self.ID()); + console.log("%s ID '%s' initialized!", Self.Doodad().Title, Self.ID()); Self.SetHitbox(0, 0, 33, 33); // When the button is activated, don't keep toggling state until we're not diff --git a/dev-assets/doodads/switches/switch.js b/dev-assets/doodads/switches/switch.js index 489aedf..c5aff2e 100644 --- a/dev-assets/doodads/switches/switch.js +++ b/dev-assets/doodads/switches/switch.js @@ -1,5 +1,5 @@ function main() { - console.log("%s initialized!", Self.Doodad.Title); + console.log("%s initialized!", Self.Doodad().Title); // Switch has two frames: // 0: Off diff --git a/dev-assets/doodads/trapdoors/down.js b/dev-assets/doodads/trapdoors/down.js index 1f383cb..2ed3907 100644 --- a/dev-assets/doodads/trapdoors/down.js +++ b/dev-assets/doodads/trapdoors/down.js @@ -1,5 +1,5 @@ function main() { - console.log("%s initialized!", Self.Doodad.Title); + console.log("%s initialized!", Self.Doodad().Title); var timer = 0; diff --git a/dev-assets/doodads/trapdoors/trapdoor.js b/dev-assets/doodads/trapdoors/trapdoor.js index a5b4f71..9e2a27a 100644 --- a/dev-assets/doodads/trapdoors/trapdoor.js +++ b/dev-assets/doodads/trapdoors/trapdoor.js @@ -1,6 +1,6 @@ function main() { // What direction is the trapdoor facing? - var direction = Self.Doodad.Tag("direction"); + var direction = Self.Doodad().Tag("direction"); console.log("Trapdoor(%s) initialized", direction); var timer = 0;