Я переместил алгоритм столкновения из части управления направлением (верно == верно и т. Д.), И проблема решена. Конечное состояние ниже. Также изменено логическое значение на "dx and dy".
Хотя право равно true, я перемещаю объект, затем устанавливаю значение true, и это приводит к тому, что цикл запускается один раз, поэтому он не вычисляет другие объекты.
Приветствие.
let speed = 5;
let dx = 0;
let dy = 0;
let p = {
x: '',
y: '',
w: parseInt($("i").css("width")),
h: parseInt($("i").css("height"))
}
var block = [
{
x: parseInt($("#block").css("left")),
y: parseInt($("#block").css("top")),
w: parseInt($("#block").css("width")),
h: parseInt($("#block").css("height"))
},{
x: parseInt($("#block2").css("left")),
y: parseInt($("#block2").css("top")),
w: parseInt($("#block2").css("width")),
h: parseInt($("#block2").css("height"))
}];
$(document).on('keydown', function(e){
//LEFT or RIGHT arrow pressed
if(e.keyCode == 37) {
dx = -speed;
} else if(e.keyCode == 39) {
dx = speed;
}
//UP or DOWN arrow pressed
if(e.keyCode == 38) {
dy = -speed;
} else if(e.keyCode == 40) {
dy = speed;
}
});
//Collision detection
function collision() {
//Left to right
for(let i in block) {
p.x = parseInt($("i").css("left"));
p.y = parseInt($("i").css("top"));
if(
p.x + p.w + dx > block[i].x &&
p.y + p.h > block[i].y &&
p.y < block[i].y + block[i].h &&
p.x + p.w < block[i].x + block[i].w
)
{
$("i").css({"left": block[i].x - p.w});
dx = 0;
}
if(dx > 0) {
$("i").css({"left": p.x + dx});
dx = 0;
}
}
//Right to left
for(let i in block) {
p.x = parseInt($("i").css("left"));
p.y = parseInt($("i").css("top"));
if(
p.x + dx < block[i].x + block[i].w &&
p.y + p.h > block[i].y &&
p.y < block[i].y + block[i].h &&
p.x > block[i].x
)
{
let z = $("i").css({"left": block[i].x + block[i].w});
dx = 0;
}
if(dx < 0) {
$("i").css({"left": p.x + dx});
dx = 0;
}
}
//Down to up
for(let i in block) {
p.x = parseInt($("i").css("left"));
p.y = parseInt($("i").css("top"));
if(
p.y + dy < block[i].y + block[i].h &&
p.x + p.w > block[i].x &&
p.x < block[i].x + block[i].w &&
p.y > block[i].y
)
{
$("i").css({"top": block[i].y + block[i].h});
dy = 0;
}
if(dy < 0) {
$("i").css({"top": p.y + dy});
dy = 0;
}
}
//Up to down
for(let i in block) {
p.x = parseInt($("i").css("left"));
p.y = parseInt($("i").css("top"));
if(
p.y + p.h + dy > block[i].y &&
p.x + p.w > block[i].x &&
p.x < block[i].x + block[i].w &&
p.y + p.h < block[i].y + block[i].h
)
{
$("i").css({"top": block[i].y - p.h});
dy = 0;
}
if(dy > 0) {
$("i").css({"top": p.y + dy});
dy = 0;
}
}
}
setInterval(collision,1);
i {
position: absolute;
width: 15px;
height: 15px;
background: red;
border-radius: 50%;
left: 0px;
top: 0px;
}
#block {
position: absolute;
margin: 0;
left: 65px;
top: 120px;
width: 20px;
height: 50px;
background: gray;
}
#block2 {
position: absolute;
margin: 0;
left: 345px;
top: 60px;
width: 20px;
height: 50px;
background: gray;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<i></i>
<div id="block"></div>
<div id="block2"></div>