Я не слежу за строкой
переменный угол: Number = Math.atan2 (charY - (shotY + shotSpeedY), charX - (shotX + shotSpeedX));
должен делать. Вектор (charY - shotY, charX - shotX) будет радиус-вектором, указывающим от местоположения выстрела до местоположения персонажа. Но что у вас есть, когда вы вычитаете вектор скорости из этого, как вы делаете в этой строке?
Мне кажется, что вам нужно сделать:
Рассчитать радиус-вектор (rY, rX) где rY = shotY - charY; rX = xhotX - charX
Вычислить оптимальное направление прыжка, если персонаж не ограничен точкой компаса.
Начните с вектора, повернутого на 90 градусов от вектора радиуса выстрела персонажа. Скажите vJump = (rX, -rY). (Я думаю, что у Дарена немного неправильный расчет - вы перемещаете две координаты и меняете один из их знаков.)
Персонаж должен либо хотеть прыгнуть в направлении vJump или в направлении -vJump. Чтобы узнать какой, возьмите скалярное произведение vJump с (shotSpeedY, shotSpeedX). Если это положительно, то персонаж прыгает в сторону пули, что вам, очевидно, не нужно, поэтому в этом случае поменяйте знак обоих компонентов vJump.
Прыжок в допустимом направлении, ближайшем к vJump. В указанном вами коде вы вынуждены прыгать в одном из диагональных направлений - вы никогда не будете прыгать в одном из основных направлений. Фактически это может быть математически оптимальным решением, поскольку диагональные скачки, вероятно, длиннее кардинальных скачков в 1,414 раза.
Однако, если ваши прыжки на самом деле равны расстоянию или если вам просто не нравится, как он выглядит, если персонаж всегда прыгает по диагонали, вы можете проверить каждое из восьми основных и промежуточных направлений, вычислив скалярное произведение между vJump и каждый из восьми векторов направления (0,1), (0,7071,0,7071), (1,0), (0,7071, -0,7071) и т. д. Выберите направление, которое дает наибольший положительный скалярный продукт. Учитывая имеющиеся шаблоны, с помощью некоторых умных программ вы можете сделать это менее чем за восемь тестов.
Обратите внимание, что этот алгоритм избегает любой математики, более сложной, чем сложение и умножение, поэтому, вероятно, будет иметь гораздо лучшую производительность, чем та, которая требует триггерных функций.