/
Vibek
/
First_Game
Обзор
Документация
Войти
/
Vibek
/
First_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
controllers/algorithms/reflection_solver.py
52 строки
3 KB
Vibek
Реализованы пассивные способности, отлажен менеджер волн, реализовано 'умное' парирование
13 июн 2026, 19:59
13 июн 2026, 19:59
077e51b
Код
Авторство
О чём код?
from pygame.math import Vector2 from core.config import Config class ParryReflectionSolver: """ Расчет вектора отражения снаряда при успешном парировании. Реализует формулу отражения: R = D - 2(D·N)N С добавлением homing_factor для гарантии попадания в стрелка. """ @staticmethod def calculate_reflection( projectile_pos: Vector2, player_facing_dir: Vector2, projectile_dir: Vector2, shooter_pos: Vector2, homing_factor: float = Config.HOMING_FACTOR ) -> Vector2: """ Рассчитывает итоговый вектор направления отраженного снаряда. :param projectile_pos: Точка, где произошло парирование (позиция снаряда) :param player_facing_dir: Нормаль поверхности (куда смотрит игрок в момент парри) :param projectile_dir: Текущий вектор направления снаряда (до отражения) :param shooter_pos: Позиция врага, выпустившего снаряд (для коррекции) :param homing_factor: Коэффициент "подмешивания" направления на стрелка (по умолчанию 0.1) :return: Новый нормализованный Vector2 направления полета """ # 1. Гарантируем, что входные векторы нормализованы (защита от ошибок) normal = player_facing_dir.normalize() incoming_dir = projectile_dir.normalize() # 2. Чистое физическое отражение: R = D - 2(D·N)N # dot_product показывает, насколько векторы сонаправлены (от -1.0 до 1.0) dot_product = incoming_dir.dot(normal) reflection_vec = incoming_dir - 2 * dot_product * normal # 3. Расчет вектора, направленного строго от точки парри к стрелку # Защита от деления на ноль, если снаряд и стрелок в одной точке (крайне маловероятно) to_shooter_vec = shooter_pos - projectile_pos if to_shooter_vec.length_squared() > 0: to_shooter = to_shooter_vec.normalize() else: to_shooter = Vector2(0, 0) # 4. Коррекция траектории: подмешиваем направление на стрелка к физическому отражению # и нормализуем итоговый вектор, чтобы его длина снова стала равна 1.0 final_direction = (reflection_vec + (to_shooter * homing_factor)).normalize() return final_direction