Надеюсь, у тебя все хорошо. Я начинающий программист, и недавно я работал над движком 2d физики в JavaScript. Казалось, что все работает нормально, пока я не наткнулся на досадную ошибку в моем pu sh mechani c.
. Я создал систему pu sh со встречным квадратом (игроком), который может pu sh одновременно несколько других встречных квадратов и останавливаются, когда квадраты ударяются о стену (чего нельзя сделать pu sh). Однако, когда игрок толкает один или несколько квадратов одновременно, все они летят к вершине стены, за исключением квадрата, который находится ближе всего к стене (как видно на видео).
Файлы проекта
Видео, в котором показана проблема
Я уже некоторое время пытаюсь решить эту проблему и просто не могу найти идеальное решение.
Если кто-нибудь сможет помочь, было бы здорово. Спасибо
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;
}
}