survivors: adding collision for faster projectiles to also consider collisions between ticks

differentiating between pistol and homing pistol
using projectile speed for straight projectile
This commit is contained in:
Sheldan
2025-08-22 00:23:22 +02:00
parent 07b64154e1
commit 66ef2eaa31
7 changed files with 114 additions and 26 deletions

View File

@@ -23,4 +23,37 @@ export function toRad(angle) {
export function toDegrees(angle) {
return angle * 180 / Math.PI
}
export function pointInsideCircle(circleCenter: Vector, radius: number, point: Vector) {
return circleCenter.distanceTo(point) < radius;
}
export function linePointCollision(point: Vector, lineStart: Vector, lineEnd: Vector) {
let lineLength = Vector.createVector(lineEnd, lineStart).vecLength();
let distanceStart = Vector.createVector(lineStart, point).vecLength()
let distanceEnd = Vector.createVector(lineEnd, point).vecLength();
let buffer = 0.001
if((distanceStart + distanceEnd) >= (lineLength - buffer) && (distanceEnd + distanceStart) <= (lineLength + buffer)) {
return true;
}
return false;
}
export function circleLineCollision(circleCenter: Vector, radius: number, lineStart: Vector, lineEnd: Vector) {
if(pointInsideCircle(circleCenter, radius, lineStart) || pointInsideCircle(circleCenter, radius, lineEnd)) {
return true;
}
let lineVector = Vector.createVector(lineEnd, lineStart)
let vectorCenterLine = Vector.createVector(circleCenter, lineStart)
let dot = vectorCenterLine.dotProduct(lineVector)
let closestX = lineStart.x + (dot * (lineVector.x))
let closestY = lineStart.y + (dot * (lineVector.y))
let closestPoint = new Vector(closestX, closestY);
let onSegment = linePointCollision(closestPoint, lineStart, lineEnd)
if(!onSegment) {
return false;
}
return pointInsideCircle(circleCenter, radius, closestPoint);
}