BattleEffects.tsx
Обзор
BattleEffects.tsx — это React-компонент, реализующий визуальные эффекты для пошаговых боёв элементалей в зависимости от выбранного элемента (огонь, вода, земля). Он использует библиотеку PixiJS для создания высокопроизводительных 2D-анимаций и обеспечивает адаптивность эффектов под разные устройства — от десктопов до мобильных экранов.
Основная задача компонента — отображать динамические частицы, волны, искры и кристаллы, визуализирующие стихии боя, создавая атмосферу и усиливая визуальное восприятие сражения. Компонент запускается только когда активен (isActive), а его анимации оптимизированы под размеры экрана и производительность устройства.
Составные части и функциональность
Интерфейс BattleEffectsProps
interface BattleEffectsProps {
isActive: boolean; // Флаг активности эффекта (отображать или нет)
element: 'fire' | 'water' | 'earth'; // Выбранный элемент для отображения соответствующих эффектов
}
Компонент BattleEffects
const BattleEffects: React.FC<BattleEffectsProps> = ({ isActive, element }) => { ... }
Параметры:
isActive(boolean): определяет, должны ли эффекты отображаться. Еслиfalse, компонент не рендерится.element('fire' | 'water' | 'earth'): задаёт элемент, для которого будут создаваться эффекты.
Возвращаемое значение:
React-элемент — контейнер
<div>, внутри которого размещается канвас PixiJS с анимациями.
Описание работы:
Инициализация PixiJS:
Создаётся экземпляр
PIXI.Applicationс параметрами, адаптированными под размер экрана и устройство.Канвас добавляется в DOM под элементом
canvasRef.
Определение типа устройства:
isMobileиisSmallMobileвычисляются черезuseMemo, основываясь на размерах окна браузера.Это влияет на качество рендеринга и параметры анимации для оптимизации производительности.
Цветовые схемы эффектов:
Цвета для каждого элемента (primary, secondary, glow) хранятся в объекте
elementColors.
Создание эффектов:
В цикле с интервалами создаются три типа эффектов:
Энергетические волны (
createEnergyWave): круги, которые масштабируются и затухают.Искры (
createSparkle): частицы со звездообразными или ромбовидными формами, которые движутся вверх, вращаются и исчезают.Элементно-специфичные эффекты (
createElementEffect):Огонь: частицы-огоньки, которые двигаются и колышутся.
Вода: расширяющиеся и затухающие круги-волны.
Земля: кристаллы с полигонами, которые поднимаются, поворачиваются и исчезают.
Анимация:
Для каждого эффекта запускается функция
animate, которая обновляет параметры (масштаб, альфа, позиция, вращение) с помощьюrequestAnimationFrame.При окончании анимации объекты удаляются из сцены и уничтожаются.
Оптимизация и очистка:
Интервалы очистки анимаций сбрасываются при размонтировании компонента.
PixiJS приложение уничтожается, чтобы освободить ресурсы.
Условный рендеринг:
Если
isActive—false, возвращаетсяnullбез рендеринга.
Важные детали реализации и алгоритмы
Адаптивность под устройства:
На маленьких экранах и мобильных устройствах уменьшается число частиц, упрощается форма (например, ромб вместо звезды), снижается разрешение и отключается антиалиасинг для повышения производительности.
Использование
requestAnimationFrame:Анимация плавно обновляется в цикле без блокировки основного потока, что обеспечивает плавность и отзывчивость.
Использование PixiJS Graphics API:
Для создания векторных фигур (круги, полигоны) с заливкой и линиями, что позволяет гибко и эффективно создавать кастомные формы.
Случайное позиционирование:
Параметры появления частиц выбираются случайно по ширине и высоте экрана для естественного распределения эффектов.
Взаимодействие с другими частями системы
Интеграция с
BattleAnimationPixi.tsx:BattleEffectsзапускается в фазе показа элементалей, где требуется визуализация стихийных эффектов поверх анимации боя.
Зависимость от пропсов:
При изменении
elementилиisActiveэффекты пересоздаются, что позволяет переключать визуализацию динамически.
Визуальная составляющая пошаговых битв:
Дополняет основную логику боя, реализованную в
gameLogic.ts, и интерфейс выбора/показа боёв (BattleComponent.tsx,BattleResultPage.tsx).
Пример использования
// Внутри BattleAnimationPixi.tsx или другого компонента анимации боя
<BattleEffects isActive={true} element="fire" />
Структура компонента в виде диаграммы
classDiagram
class BattleEffects {
-canvasRef: React.RefObject<HTMLDivElement>
-appRef: React.RefObject<PIXI.Application | null>
-isMobile: boolean
-isSmallMobile: boolean
-elementColors: Record<string, {primary: number, secondary: number, glow: number}>
+BattleEffects(props: BattleEffectsProps)
+render() React.ReactElement | null
-createEnergyWave(): void
-createSparkle(): void
-createElementEffect(): void
}
Итог
Компонент BattleEffects.tsx — это специализированный визуальный модуль, который с помощью PixiJS создаёт сложные, адаптивные и стилистически согласованные эффекты стихий для пошаговых боёв в игре. Он повышает визуальную привлекательность и погружение в игровой процесс, интегрируясь с основным модулем анимации боя и бизнес-логикой, при этом учитывая особенности разных устройств и обеспечивая оптимальную производительность.
Если нужна дополнительная информация по интеграции с другими компонентами или по оптимизации анимаций — готов предоставить.