improve position fixing

This commit is contained in:
2025-01-11 18:17:44 +09:00
parent f1c191f61f
commit 4aba510ec0
8 changed files with 117 additions and 34 deletions
+25 -11
View File
@@ -69,18 +69,32 @@ export default class SATX {
])
}
static fixCollisions(entityPosition, colliders, radius = 0) {
const position = entityPosition.clone()
let collider = Entity.collider(position.x, position.y, radius)
colliders.forEach((c) => {
let result = new SAT.Response()
if (this.collideObject(collider, c, result)) {
position.sub(new Vector2(result.overlapV.x, result.overlapV.y))
collider = Entity.collider(position.x, position.y, radius)
}
})
static fixCollisions(entityPosition, colliders, radius = 0, maxX = Infinity, maxY = Infinity) {
if (!this.collideObjects(Entity.collider(entityPosition.x, entityPosition.y, radius), colliders)) {
return entityPosition
}
// console.time('fixCollisions')
return position
let direction = new Vector2(0, 5)
let multiplier = 1
const rotationSlices = 16
for (let limit = 1; limit <= 10000; limit++) {
const rads = (limit % rotationSlices) * 2 * Math.PI / rotationSlices
const offset = direction.clone().rotateAround(new Vector2(), rads).multiplyScalar(multiplier)
const position = SATX.clamp(entityPosition.clone().add(offset), maxX, maxY, radius)
if (!this.collideObjects(Entity.collider(position.x, position.y, radius), colliders)) {
// console.timeEnd('fixCollisions')
return position
}
if (limit % rotationSlices == 0) {
multiplier++
}
}
// console.timeEnd('fixCollisions')
console.error('ERROR: can\'t fix collision')
}
static line(fromX, fromY, toX, toY) {