Rechteck-2D-Kollisionserkennung und -reaktion, die mit Ecken funktioniertJavaScript

Javascript-Forum
Guest
 Rechteck-2D-Kollisionserkennung und -reaktion, die mit Ecken funktioniert

Post by Guest »

Ich mache ein 2D-Spiel und habe große Probleme mit 2D-Kollisionen. Ich habe Code, der bis auf Ecken gut zu funktionieren scheint. Wenn ein Wesen jedoch genau mit einer Ecke kollidiert, läuft es am Ende einfach geradeaus.
Ich habe buchstäblich drei Wochen lang versucht, das Problem zu beheben. Ich habe KI ausprobiert, ich habe Dokumentation und YT-Tutorials ausprobiert (woher ich den Code habe, den ich jetzt habe), aber nichts scheint auch für Ecken zu funktionieren.
Hier ist mein aktueller Code :

Code: Select all

for (let i = 0; i < entityHitboxLength; i += 8) {
let entityX = entityHitboxes[i];
let entityY = entityHitboxes[i + 1];
let entityXW = entityHitboxes[i + 2];
let entityYH = entityHitboxes[i + 3];
let prevEntityX = entityHitboxes[i + 4];
let prevEntityY = entityHitboxes[i + 5];
let prevEntityXW = entityHitboxes[i + 6];
let prevEntityYH = entityHitboxes[i + 7];

if (
selfYH > entityY &&
selfY < entityYH &&
selfX < entityXW &&
selfXW > entityX
) {
if (selfYH >= entityY && prevSelfYH < prevEntityY) {
selfYH = entityY - 1;
selfY = entityY - 1 - height;
} else if (selfY  prevEntityYH) {
selfY = entityYH + 1;
selfYH = entityYH + 1 + height;
}
else if (selfXW >= entityX && prevSelfXW < prevEntityX) {
selfXW = entityX - 1;
selfX = entityX - 1 - width;
} else if (selfX  prevEntityXW) {
selfX = entityXW + 1;
selfXW = entityXW + 1 + width;
}
}
}
Hier ist die Codedokumentation, die ich dafür verwendet habe.
Ziemlich einfach und funktioniert gut für Kanten.
Ich habe auch eine KI ausprobiert generierter Ansatz wie

Code: Select all

if (
selfYH > entityY &&
selfY < entityYH &&
selfX < entityXW &&
selfXW > entityX
) {
// Calculate overlaps on both axes
const overlapY = Math.min(selfYH - entityY, entityYH - selfY);
const overlapX = Math.min(selfXW - entityX, entityXW - selfX);

// Resolve the smaller overlap first
if (overlapX < overlapY) {
// Resolve X-axis collision
if (selfXW >= entityX && prevSelfXW < prevEntityX) {
selfXW = entityX - 1;
selfX = entityX - 1 - width;
} else if (selfX  prevEntityXW) {
selfX = entityXW + 1;
selfXW = entityXW + 1 + width;
}
} else {
// Resolve Y-axis collision
if (selfYH >= entityY && prevSelfYH < prevEntityY) {
selfYH = entityY - 1;
selfY = entityY - 1 - height;
} else if (selfY  prevEntityYH) {
selfY = entityYH + 1;
selfYH = entityYH + 1 + height;
}
}
}
Aber dieser geht noch mehr durch als der, den ich verwende, sogar in Ecken. Stimmt etwas mit diesem Code nicht? Wie kann ich es zum Laufen bringen?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post