/
Vibek
/
First_Game
Обзор
Документация
Войти
/
Vibek
/
First_Game
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
models/projectile.py
77 строк
3 KB
Vibek
Спрайты и хитбоксы натянуты и синхронизированы
19 июн 2026, 13:56
19 июн 2026, 13:56
e17c6dd
Код
Авторство
О чём код?
import math import pygame from pygame.math import Vector2 from models.entity import Entity from core.events import EventBus from core.config import Config from models.hitbox import HitboxDef class Projectile(Entity): """ Модель снаряда. Наследуется от Entity для единого интерфейса коллизий (get_obb_corners) и совместимости с будущим SpatialHash (Алгоритм 3). """ def __init__( self, x: float, y: float, direction: Vector2, speed: float, owner_id: int, bus: EventBus, size: tuple[int, int] = (10, 10), is_reflected: bool = False, hitbox: HitboxDef | None = None, art_angle_offset: float = 0.0, ) -> None: super().__init__( x, y, speed, size, bus, hp=1, hitbox=hitbox, art_angle_offset=art_angle_offset, ) self.direction = direction.normalize() self.owner_id = owner_id self.is_reflected = is_reflected self.damage = 1 self._sync_facing_from_direction() def _sync_facing_from_direction(self) -> None: self.angle = math.degrees(math.atan2(self.direction.y, self.direction.x)) def update(self, dt: float) -> None: """ Обновляет позицию снаряда. Frame-rate independent (зависит от dt). """ if not self.is_alive: return # Движение: новая позиция = текущая + (направление * скорость * время) movement = self.direction * self.speed * dt self.pos += movement self._sync_facing_from_direction() self._sync_rect() def reflect(self, new_direction: Vector2) -> None: """ Меняет траекторию снаряда (подготовка для Алгоритма 2). По правилам README: отраженный снаряд летит со скоростью x1.5. """ self.direction = new_direction.normalize() self.speed *= 1.5 self.is_reflected = True self._sync_facing_from_direction() # Меняем владельца на -1 (нейтральный/игрок), чтобы снаряд # мог убить врага, но не мог случайно убить игрока при обратной коллизии. # Детали обработки коллизий мы настроим на следующем шаге. self.owner_id = -1 def take_damage(self, amount: int) -> None: """ Снаряд уничтожается при любом столкновении (с игроком, врагом или стеной). """ self.hp -= amount if self.hp <= 0: self.is_alive = False # В будущем здесь можно добавить self.bus.emit("projectile:destroyed", {...})