BattleAnimationPixi.tsx

Обзор

Компонент BattleAnimationPixi.tsx реализует визуализацию боя между игроком и оппонентом с использованием библиотеки PixiJS для рендеринга 2D-графики и React для управления состоянием и UI. Он отвечает за последовательное отображение анимаций различных фаз боя:

Компонент адаптирован для разных устройств (мобильных и десктопных), оптимизирует производительность (например, снижая количество частиц на мобильных) и плавно переключается между фазами с помощью таймеров. Визуальные эффекты стихий (огонь, вода, земля) выводятся через дочерний компонент BattleEffects.

BattleAnimationPixi является связующим звеном между бизнес-логикой (состоянием игры и результатами боя) и визуальной составляющей, обеспечивая эффектное и информативное представление боя.


Подробное описание компонентов и функций

BattleAnimationPixiProps

Интерфейс пропсов компонента:

Свойство

Тип

Описание

gameState

GameState

Текущее состояние игры, содержит данные игроков, выбранных элементалей и др.

opponentElement

Element

Стихия оппонента (fire, water, earth)

onAnimationComplete

() => void

Колбек, вызываемый по окончании полной анимации боя

battleResult?

`'player'

'opponent'


BattleAnimationPixi (React.FunctionComponent)

Основной функциональный React-компонент, который:


Состояния (State)

Название

Тип

Описание

phase

`'intro'

'cards'

elementalPhase

`'player'

'opponent'

isMobile

boolean

Флаг, указывающий на мобильное устройство (ширина экрана < 768px)


useEffect - Инициализация PixiJS


useEffect - Обработка изменения размера окна

Отслеживает изменение ширины окна для корректного определения isMobile, что влияет на производительность и стили.


useEffect - Таймлайн анимации фаз


useEffect - Таймлайн подфаз элементалей

В фазе elementals происходит последовательное переключение подфаз:

Если элементали отсутствуют у одной из сторон, подфазы не запускаются.


UserCard (вложенный компонент)

Отвечает за визуализацию карточки с выбранной стихией:

<UserCard element="fire" isAnimating={true} />

Основной JSX разметки

В зависимости от текущей фазы (phase), компонент отображает:

Также выводятся:


Важные детали реализации


Взаимодействие с остальными частями системы


Пример использования

<BattleAnimationPixi
  gameState={currentGameState}
  opponentElement="water"
  battleResult="player"
  onAnimationComplete={() => {
    console.log('Анимация боя завершена');
    // Переход к экрану результатов
  }}
/>

Диаграмма структуры компонента

classDiagram
    class BattleAnimationPixi {
        -phase: 'intro' | 'cards' | 'elementals' | 'result'
        -elementalPhase: 'player' | 'opponent' | 'battle' | 'winner'
        -isMobile: boolean
        -canvasRef: React.RefObject<HTMLDivElement>
        -appRef: React.RefObject<PIXI.Application | null>
        -particlesRef: React.RefObject<PIXI.Container | null>
        +gameState: GameState
        +opponentElement: Element
        +onAnimationComplete(): void
        +battleResult?: 'player' | 'opponent' | 'draw' | undefined
        +UserCard(element: Element, isAnimating?: boolean)
        +render()
    }

    class BattleEffects {
        +isActive: boolean
        +element: Element
        +render()
    }

    BattleAnimationPixi --> BattleEffects : использует

Заключение

BattleAnimationPixi.tsx — ключевой визуальный компонент, обеспечивающий динамичную и эффектную анимацию боя в пошаговом режиме. Благодаря интеграции с PixiJS и React он создаёт плавные переходы между фазами боя, адаптируется под мобильные устройства и предоставляет богатые визуальные эффекты, усиливающие игровой опыт. Компонент выделяет логику анимации из бизнес-логики, упрощая поддержку и расширение игровых возможностей.


Приложение

Mermaid диаграмма процесса анимации боя

flowchart TD
    Start[Запуск анимации боя]
    Intro[Фаза: Вступление]
    Cards[Фаза: Показ карт игроков]
    Elementals[Фаза: Появление элементалей и бой]
    ElementalPlayer[Появление элементаля игрока]
    ElementalOpponent[Появление элементаля оппонента]
    Battle[Анимация боя элементалей]
    Winner[Отображение победителя]
    Result[Финальный результат боя]
    End[Завершение анимации]

    Start --> Intro --> Cards --> Elementals
    Elementals --> ElementalPlayer --> ElementalOpponent --> Battle --> Winner --> Result --> End

Данная диаграмма отражает основные этапы анимации внутри компонента BattleAnimationPixi, показывая последовательность переходов и подфаз внутри показа и боя элементалей.