Надеюсь, у тебя все хорошо. Я начинающий программист, и недавно я работал над движком 2d физики в JavaScript. Казалось, что все работает нормально, пока я не столкнулся с досадной ошибкой в моем pu sh mechani c.
Я создал 2d систему столкновений, где объект A будет отталкиваться b объект B, et c. Кроме того, я создал pu sh mechani c, то есть объект A может использовать pu sh объект b (если это не solid). Тем не менее, я столкнулся с проблемой, когда, например, объект A (игрок), объект B (ящик, который игрок может сделать sh) и объект C (Solid стена), он возникает, когда объект толкает объект b в отношении объекта происходит то, что объект B отталкивается объектом A, но объект A не отталкивается смыслом B, объект A попадет внутрь объекта B и вытолкнет объект на верх вместо толкая его влево, активируя неправильное обнаружение столкновений. (как видно на видео).
Файлы проекта
Видео, в котором показана проблема
Я пытался чтобы решить эту проблему на некоторое время, и я просто не могу найти идеальное решение.
Если кто-нибудь сможет помочь, было бы здорово. Спасибо
collisionDetection: function(game) {
var collisionDetection = function(obj01, obj02) {
if(obj01.x < obj02.x + obj02.colW &&
obj01.x + obj01.colW > obj02.x &&
obj01.y < obj02.y + obj02.colH &&
obj01.y +obj01.colH > obj02.y) {
physics.handleCollision(obj01, obj02);
}
};
for (let i = 0; i < game.gameComponents.length; i++) {
for (let j = i + 1; j < game.gameComponents.length; j++) {
const obj01 = game.gameComponents[i];
const obj02 = game.gameComponents[j];
collisionDetection(obj01, obj02);
}
}
},
handleCollision: function(obj01, obj02) {
var tr = obj01.x + obj01.colW // This right side
var tl = obj01.x // This left
var tt = obj01.y // This top
var or = obj02.x + obj02.colW // Other right
var ol = obj02.x // Other left
var ot = obj02.y // Other top
// North, east, south, west of other (around)
if (obj02.colType == "nesw") {
// Top of other
if(obj01.y+obj01.colH>obj02.y && tl + obj01.colW > obj02.x+3 && tl < obj02.x+obj02.colW-3) {
obj01.y = obj02.y - obj01.colH;
}
// Bottom of other
if(tr > ol + 3 && tl < or - 3 && tt > ot) {
obj01.y = obj02.y + obj02.colH;
}
// Left of other
if(tl < obj02.x && obj01.y + obj01.colH > obj02.y && obj01.y < obj02.y + obj02.colH) {
if (obj02.pushable == true ) {
obj02.x = (obj01.x + obj01.colW)
}else {
obj01.x = (obj02.x - obj01.colW)
}
}
// right of other
if(tl > obj02.x && obj01.y + obj01.colH > obj02.y && obj01.y < obj02.y + obj02.colH) {
obj01.x = obj02.x + obj02.colW;
}
}