move and slide
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -12,6 +12,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "portal",
|
||||||
|
"init": {
|
||||||
|
"position": {
|
||||||
|
"x": 24,
|
||||||
|
"y": 41
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "portal",
|
"name": "portal",
|
||||||
"init": {
|
"init": {
|
||||||
|
|||||||
Reference in New Issue
Block a user