the other way round
This commit is contained in:
+39
-12
@@ -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,
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
@@ -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)),
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user