Моя программа - игра, основанная на столкновениях. Однако функция обнаружения столкновений работает со сбоями и быстро увеличивает счет в случайных точках и заканчивает игру раньше, даже если игрок ни с чем не сталкивается. Я просматривал свой код в течение нескольких дней и пробовал несколько функций обнаружения столкновений, но у меня все еще возникает эта проблема. Я делаю эту игру в лаборатории приложений code.org и подозреваю, что это может быть их конец. Но я просто хотел знать, не упускаю ли я чего-то. Вот ссылка на мою программу: https://studio.code.org/projects/applab/4gT5jkTadBOpofcLX__AvAeb0R3keRYLobVqNhHYaqM
var collectedSouls = 0;
var timer = 30;
onEvent("startBtn", "click", function(event) {
setScreen("Gamescreen");
playSound("Windows XP startup.mp3", false);
});
onEvent("Begin", "click", function(event) {
onEvent("Gamescreen", "keydown", function(event) {
var x = 0;
var y = 0;
if (event.key == "Down") {
y = 3;
} else if ((event.key == "Up")) {
y = -3;
} else if ((event.key == "Left")) {
x = -3;
} else if ((event.key == "Right")) {
x = 3;
}
setPosition("player", getXPosition("player") + x, getYPosition("player") + y);
wrapAround("player");
});
timedLoop(1000, function() {
setText("Timer", timer);
timer = timer - 1;
if (timer <= 0) {
setScreen("GameOver");
}
});
});
onEvent("Begin", "click", function(event) {
timedLoop(1, function() {
moveObject("spirit1", randomNumber(-10, 10), randomNumber(-10, 10));
moveObject("spirit2", randomNumber(-10, 10), randomNumber(-10, 10));
moveObject("spirit3", randomNumber(-10, 10), randomNumber(-10, 10));
moveObject("spirit4", randomNumber(-10, 10), randomNumber(-10, 10));
moveObject("spirit5", randomNumber(-10, 10), randomNumber(-10, 10));
moveObject("spirit6", randomNumber(-10, 10), randomNumber(-10, 10));
moveObject("spirit7", randomNumber(-10, 10), randomNumber(-10, 10));
});
});
function moveObject(object, xMove, yMove) {
var x = getXPosition(object) + xMove;
var y = getYPosition(object) + yMove;
setPosition(object, x, y);
collision(getXPosition("player"), getYPosition("player"), getProperty("player", "width"), getProperty("player", "height"), getXPosition(object), getYPosition(object), getProperty(object, "width"), getProperty(object, "height"));
if (collision()=== true) {
hideElement(object);
collectedSouls = collectedSouls + 1;
if (collectedSouls >= 7) {
setScreen("Victory");
}
}
wrapAround(object);
}
function collision(x1, y1, w1, h1, x2, y2, w2, h2) {
w2 += x2;
w1 += x1;
if (x2 > w1 || x1 > w2) return false;
h2 += y2;
h1 += y1;
if (y2 > h1 || y1 > h2) return false;
return true;
}
function wrapAround(object) {
var objx = getXPosition(object);
var objy = getYPosition(object);
var Width = getProperty(object, "width");
var Height = getProperty(object, "height");
if (objx < 0 - Width / 2) {
objx = 320 - Width / 2;
} else if ((objx > 320 - Width / 2)) {
objx = 0 - Width / 2;
} else if ((objy < 0 - Height / 2)) {
objy = 450 - Height / 2;
} else if ((objy > 450 - Height / 2)) {
objy = 0 - Height / 2;
}
setPosition(object, objx, objy);
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот небольшой фрагмент - это может помочь разбить вещи и не иметь все в строке, вместо этого создайте переменные для ссылки для объектов.
function collision(x1, y1, w1, h1, x2, y2, w2, h2) {
w2 += x2;
w1 += x1;
if (x2 > w1 || x1 > w2) return false;
h2 += y2;
h1 += y1;
if (y2 > h1 || y1 > h2) return false;
return true;
}
Здесь вы хотите сравнить 2 объекта, как вы, но сохраните все в чистоте, чтобы лучше понять, что все происходит.
Я попытался использовать этот фрагмент, но проблема не исчезла. Вот прямая ссылка на мою программу. ссылка на сайт
Не могли бы вы привести полный пример того, как запустить свой код? За ним довольно сложно следить, не имея возможности запустить его или не увидев, какие функции вызываются, когда