Система обнаружения столкновений Javascript не игнорирует заблокированные столкновения
У меня возникают проблемы во время разработки мини-игр с использованиемEaselJS с моей системой обнаружения столкновений, и мне нужна чья-то помощь. Проблема возникает, когда герой (круговая карта) сталкивается с объектом, а позади первого находится другой объект, герой сталкивается с обоими объектами, даже если второе столкновение заблокировано. Вот объяснение изображения:
Причина проблемы действительно проста, даже если сама проблема не такова:
Эта система обнаружения столкновений основана на будущем положении круга (а не на его фактическом положении), тогда, если следующее положение круга пересекает прямоугольник, оно отскочит. Проблема в том, что, если будущая позиция пересекает два прямоугольника, круг отскочит в обоих прямоугольниках - даже если фактическое движение круга заблокировано другим прямоугольником и не может достичь второго.
Обновить: Обратите внимание, что эта проблема возникает только тогда, когда стрелка вверх удерживается из-за порядка создания прямоугольника.
Вот соответствующий код JavaScript:
rects.forEach(function (rect) { // Affect all rects
// Collision detection:
// (This MUST BE after every change in xvel/yvel)
// Next circle position calculation:
var nextposx = circle.x + event.delta / 1000 * xvel * 20,
nextposy = circle.y + event.delta / 1000 * yvel * 20;
// Collision between objects (Rect and Circle):
if (nextposy + height(circle) > rect.y &&
nextposx + width(circle) > rect.x &&
nextposx < rect.x + rect.width &&
nextposy < rect.y + rect.height) {
if (circle.y + height(circle) < rect.y) {
cls("top");
}
if (circle.x + width(circle) < rect.x) {
cls("left");
}
if (circle.x > rect.x + rect.width) {
cls("right");
}
if (circle.y > rect.y + rect.height) {
cls("bottom");
}
}
// Stage collision:
if (nextposy < 0) { // Collided with TOP of stage. Trust me.
cls("bottom"); // Inverted collision side is proposital!
}
if (nextposx < 0) {
cls("right");
}
if (nextposx + width(circle) > stage.canvas.width) {
cls("left");
}
if (nextposy + height(circle) > stage.canvas.height) {
cls("top");
}
});