Простой совет: простое пространство (или невидимый специальный символ) в вашем скрипте, прямо перед самым первым тегом <?php
, может вызвать это! Особенно, когда вы работаете в команде, а кто-то использует «слабую» IDE или перепутал файлы со странными текстовыми редакторами.
Я видел эти вещи;)
Основная проблема заключается в том, что вы можете перемещаться по направлениям x и y одновременно с отключением по одному типу ошибок с некоторым обнаружением. Поэтому, когда вы находитесь на одном пикселе ниже нижней части верхнего квадрата, он фактически обнаруживает столкновение в направлении y с этим квадратом и только останавливает y от перемещения, но позволяет перемещение x.
Ниже приведено изменение, которое не допускает столкновений, хотя оно «застревает» в местах:
function fieldUpdate() {
Field.clear();
var oldX = myAvatar.x;
var oldY = myAvatar.y;
if (Field.keys && Field.keys[37]) {
myAvatar.x--;
}
if (Field.keys && Field.keys[39]) {
myAvatar.x++;
}
if (collision(myAvatar)) {
myAvatar.x = oldX;
myAvatar.y = oldY;
}
var oldX = myAvatar.x;
var oldY = myAvatar.y;
if (Field.keys && Field.keys[40]) {
myAvatar.y++;
}
if (Field.keys && Field.keys[38]) {
myAvatar.y--;
}
if (collision(myAvatar)) {
myAvatar.x = oldX;
myAvatar.y = oldY;
}
myAvatar.componentUpdate();
for (var prop in components) {
components[prop].componentUpdate();
}
}
Если вы исправили ошибку на 1, это также не должно застрял.
Еще одна проблема заключается в том, что у вас есть c.y - c.width
в нескольких местах. Вероятно, это возможно c.y - c.height
. Это будет проблемой, если вы когда-либо делаете не квадратные фигуры.
Проблема заключается в том, что вы возвращаетесь в цикле столкновений, в результате чего обнаруживается только один объект для каждого движения. Это было бы прекрасно, если бы все движения были остановлены / отменены, но изменение только одного направления позволяет другому свободно перемещаться через что-либо еще.
Способ исправить это было бы удаление всех возвратов в этой функции. Кроме того, посмотрите, что видео « Bounding Box Collision Detection » исправляет ваш алгоритм, потому что в настоящее время он игнорирует ширину и высоту вашего собственного аватара.