improve position fixing
This commit is contained in:
+25
-11
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user