Хорошо, я вижу несколько мелких деталей:
1) В этой строке hspeed при проверке старой позиции довольно избыточен, лучше всего удалить ее для ясности.
if(x + hspeed <= b.worldX+b.width-1 && x + hspeed > b.worldX+b.width + hspeed-2)
Становится:
if(x + hspeed <= b.worldX + b.width - 1 && x > b.worldX + b.width - 2)
То же самое относится и к другим аналогичным линиям.
2) Небольшие смещения -2 и -1 являютсянемного сбивает с толку, я полагаю, вы пытаетесь получить небольшой буфер, так что требуется небольшое количество наложения.Особенно в этой строке, где вы использовали <вместо <= вы использовали все остальные: </p>
if(x + hspeed <= b.worldX+b.width-1 && x + hspeed > b.worldX+b.width + hspeed-2)
Чтобы сохранить согласованность с остальной частью программы, я, вероятно, написал бы:
if(x + hspeed <= b.worldX + b.width - 1 && x >= b.worldX + b.width - 1)
3) Похоже, вам не хватает нескольких небольших смещений в проверках vert:
Итак, сначала проверьте:
if(y + height + vspeed >= b.worldY && y + height + vspeed <= b.worldY + vspeed + 1 && jumpstate=="falling")
У вас, похоже, естьзабыли ваше маленькое смещение:
if(y + height + vspeed >= b.worldY + 1 && y + height <= b.worldY + 1 && jumpstate=="falling")
Затем вторая проверка:
if(y + vspeed <= b.worldY + b.height && y + vspeed >= b.worldY + b.height + vspeed - 1 && jumpstate=="jumping")
Смещение снова:
if(y + vspeed <= b.worldY + b.height - 1 && y >= b.worldY + b.height - 1 && jumpstate=="jumping")
4) Вы будетенужно быть очень осторожным, чтобы vspeed и jumpstate всегда оставались синхронизированными, так как знак vspeed должен всегда совпадать с jumpstate, иначе вы пропустите столкновения.Я полагаю, что это может быть причиной вашей проблемы.
5) В обоих направлениях, если скорость превышает размер блока, вы пропустите обнаружение столкновений и выстрелите через блок.
if(y + height + vspeed >= b.worldY+2 && y + vspeed <= b.worldY+b.height)
Вторая проверка в этих строках будет ложной, если скорость выше b.height и координаты y схожи.
Надеюсь, что это поможет некоторым.