В первой строке вы выполняете вычисление с плавающей запятой и передаете результат функции, ожидающей строковый аргумент ... вы спасены неявным преобразованием, но это уродливо.
Огромное условное выражение в вашем второмлиния округляет угол до ближайшего кратного 22,5 градусов, оборачивая и отображая на отрицательные кратные 128, затем умножает его на s
, деленное на 128 ... было ли это изначально рассчитано на спрайты 128 пикселей?В любом случае, вы просто должны быть в состоянии сделать это:
function P_angle(x1,x2,y1,y2,s)
{
return s*(Math.round(Math.atan2(x2-x1,y2-y1)*(8/Math.PI)-8)%16);
}
Вы не говорите, насколько велико смещение с вашим исходным кодом, но я подозреваю, что это вызвано ошибками округления при делении на 128-фактори что вам просто повезло, что все округлилось правильно для 24-пиксельных спрайтов.С версией здесь вы наверняка вернете точное кратное s
.