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?
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]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;
}
}
}
[/code]
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]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;
}
}
}
[/code]
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?