move and slide

This commit is contained in:
Schluffe
2026-03-30 22:54:41 +02:00
parent ba78c98a74
commit 25d0f950e6
3 changed files with 21 additions and 6 deletions
+12 -2
View File
@@ -7,6 +7,7 @@ import {
getDistance, getDistance,
getDotProduct, getDotProduct,
invScale, invScale,
scale,
setUnitNormal, setUnitNormal,
type Vector, type Vector,
} from "#/engine/Vector.ts"; } from "#/engine/Vector.ts";
@@ -283,8 +284,17 @@ export function moveAndSlide(
): void { ): void {
const collisions = moveAndCollide(id, velocity, delta); const collisions = moveAndCollide(id, velocity, delta);
for (const collision of collisions) { for (const collision of collisions) {
const time = collision.time;
if (time === -Infinity) {
continue; // TODO
}
const dot = getDotProduct(velocity, collision.normal); const dot = getDotProduct(velocity, collision.normal);
velocity.x -= collision.normal.x * dot; const ts = Math.min(0, time - 0.001);
velocity.y -= collision.normal.y * dot; const tsx = velocity.x * ts;
const tsy = velocity.y * ts;
const rt = 1 - time;
velocity.x -= collision.normal.x * dot * rt + tsx;
velocity.y -= collision.normal.y * dot * rt + tsy;
} }
} }
-4
View File
@@ -1,6 +1,5 @@
import { defineEntity } from "#/engine/Entity.ts"; import { defineEntity } from "#/engine/Entity.ts";
import { keyboardInput } from "#/engine/Keyboard.ts"; import { keyboardInput } from "#/engine/Keyboard.ts";
import { lerp } from "#/engine/lib/lerp";
import { pointer } from "#/engine/Pointer.ts"; import { pointer } from "#/engine/Pointer.ts";
import { createRect, fillRect, strokeRect } from "#/engine/Rect.ts"; import { createRect, fillRect, strokeRect } from "#/engine/Rect.ts";
import $ from "#/engine/Scene.ts"; import $ from "#/engine/Scene.ts";
@@ -11,15 +10,12 @@ import {
} from "#/engine/Sprite.ts"; } from "#/engine/Sprite.ts";
import { import {
type Collider, type Collider,
type Collision,
createCollider, createCollider,
moveAndCollide,
moveAndSlide, moveAndSlide,
Shape, Shape,
} from "#/engine/system/physics.ts"; } from "#/engine/system/physics.ts";
import { import {
createVector, createVector,
getDotProduct,
normalize, normalize,
scale, scale,
type Vector, type Vector,
+9
View File
@@ -12,6 +12,15 @@
} }
} }
}, },
{
"name": "portal",
"init": {
"position": {
"x": 24,
"y": 41
}
}
},
{ {
"name": "portal", "name": "portal",
"init": { "init": {