the other way round

This commit is contained in:
Schluffe
2026-04-12 22:51:26 +02:00
parent 452d788090
commit 910c2bb435
3 changed files with 43 additions and 16 deletions
+39 -12
View File
@@ -260,9 +260,9 @@ function circleOnRect(
if (hitY >= top && hitY <= bottom) { if (hitY >= top && hitY <= bottom) {
return; return;
} }
const dx = ax - (hitX < left ? left : right); const dx = ax - (hitX < left ? left : right);
const dy = ay - (hitY < top ? top : bottom); const dy = ay - (hitY < top ? top : bottom);
const time = castOnCircle(dx, dy, vx, vy, radius); const time = castOnCircle(dx, dy, vx, vy, radius);
if (time === null) { if (time === null) {
collision.cid = ""; collision.cid = "";
@@ -291,17 +291,44 @@ function rectOnCircle(
colliderB: Collider, colliderB: Collider,
positionB: Vector, positionB: Vector,
delta: number, delta: number,
) {} ) {
const cWidth = (colliderA.body as Rect).width / 2;
const cHeight = (colliderA.body as Rect).height / 2;
const radius = (colliderB.body as Circle).radius;
function rectOnRect( const ax = positionA.x + colliderB.offset.x + cWidth;
collision: Collision, const ay = positionA.y + colliderB.offset.y + cHeight;
colliderA: Collider, const bx = positionB.x + colliderA.offset.x + radius;
positionA: Vector, const by = positionB.y + colliderA.offset.y + radius;
velocityA: Vector,
colliderB: Collider, const vx = velocityA.x * delta;
positionB: Vector, const vy = velocityA.y * delta;
delta: number,
) {} const left = bx - cWidth;
const right = bx + cWidth;
const hitX = ax + vx * collision.time;
if (hitX >= left && hitX <= right) {
return;
}
const top = by - cHeight;
const bottom = by + cHeight;
const hitY = ay + vy * collision.time;
if (hitY >= top && hitY <= bottom) {
return;
}
const dx = ax - (hitX < left ? left : right);
const dy = ay - (hitY < top ? top : bottom);
const time = castOnCircle(dx, dy, vx, vy, radius);
if (time === null) {
collision.cid = "";
return;
}
collision.time = time;
invScale(collision.normal, dx + vx * time, dy + vy * time);
}
function rectOnPolygon( function rectOnPolygon(
collision: Collision, collision: Collision,
@@ -349,7 +376,7 @@ const circleCollide: Array<Collide> = [
circleOnPolygon, circleOnPolygon,
]; ];
const rectCollide: Array<Collide> = [rectOnCircle, rectOnRect, rectOnPolygon]; const rectCollide: Array<Collide> = [rectOnCircle, () => {}, rectOnPolygon];
const polygonCollide: Array<Collide> = [ const polygonCollide: Array<Collide> = [
polygonOnCircle, polygonOnCircle,
+2 -2
View File
@@ -1,8 +1,8 @@
import { createCircle } from "#/engine/Circle.ts";
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 { createEffect, createSignal } from "#/engine/lib/Signal.ts"; import { createEffect, createSignal } from "#/engine/lib/Signal.ts";
import { pointer } from "#/engine/Pointer.ts"; import { pointer } from "#/engine/Pointer.ts";
import { createRect } from "#/engine/Rect.ts";
import $ from "#/engine/Scene.ts"; import $ from "#/engine/Scene.ts";
import { import {
createSprite, createSprite,
@@ -30,7 +30,7 @@ const process = defineEntity("hero", {
sprite: createSprite(idleSrc, createVector(-8, -8)), sprite: createSprite(idleSrc, createVector(-8, -8)),
animation: createSpriteAnimation(500, 2), animation: createSpriteAnimation(500, 2),
velocity: createVector(), velocity: createVector(),
collider: createCollider(Shape.Circle, createCircle(8)), collider: createCollider(Shape.Rect, createRect(16, 16)),
}); });
createEffect(() => { createEffect(() => {
+2 -2
View File
@@ -1,5 +1,5 @@
import { createCircle } from "#/engine/Circle.ts";
import { defineEntity } from "#/engine/Entity.ts"; import { defineEntity } from "#/engine/Entity.ts";
import { createRect } from "#/engine/Rect.ts";
import { import {
createSprite, createSprite,
createSpriteAnimation, createSpriteAnimation,
@@ -16,5 +16,5 @@ defineEntity("portal", {
position, position,
sprite: createSprite(portalSrc, createVector(-8, -8)), sprite: createSprite(portalSrc, createVector(-8, -8)),
animation: createSpriteAnimation(400, 0), animation: createSpriteAnimation(400, 0),
collider: createCollider(Shape.Rect, createRect(16, 16)), collider: createCollider(Shape.Circle, createCircle(8)),
}); });