import React from 'react'; import Icon from './Icon'; /** * PlayerHud — HUD игрока в Play-режиме: * - HP-полоска слева сверху с сегментами и подсветкой * - Красный flash при получении урона * - Счётчик патронов справа снизу с кольцом перезарядки */ function PlayerHud({ visible, hp, maxHp, ammo, damaged }) { if (!visible) return null; const hpPct = Math.max(0, Math.min(100, (hp / maxHp) * 100)); const lowHp = hp <= maxHp * 0.25; const midHp = !lowHp && hp <= maxHp * 0.5; const hpGradient = lowHp ? 'linear-gradient(90deg, #ff6f7a 0%, #c0303f 100%)' : midHp ? 'linear-gradient(90deg, #ffc857 0%, #f59e0b 100%)' : 'linear-gradient(90deg, #22d97a 0%, #0f9d56 100%)'; const hpGlow = lowHp ? '0 0 16px rgba(255, 111, 122, 0.55)' : midHp ? '0 0 12px rgba(255, 200, 87, 0.35)' : '0 0 12px rgba(34, 217, 122, 0.35)'; return ( <> {/* === HP-bar — ЛЕВЫЙ ВЕРХНИЙ УГОЛ === */}
{Math.round(hp)} / {maxHp}
{Math.round(hpPct)}%
{/* Полоска */}
{/* Блик сверху */}
{/* Сегментные риски (10 шт) */} {Array.from({ length: 9 }).map((_, i) => (
))}
{/* Красный flash при получении урона */} {damaged && (
)} {/* === Ammo — справа внизу, над hot-bar === */} {ammo && ( )} ); } const AmmoIndicator = ({ ammo }) => { const reloading = !!ammo.reloading; const magPct = ammo.magazineMax > 0 ? (ammo.magazine / ammo.magazineMax) * 100 : 0; const lowAmmo = !reloading && magPct < 25; // SVG-кольцо progress перезарядки const RING_R = 30; const RING_C = 2 * Math.PI * RING_R; return (
{reloading ? (
{/* Кольцо progress */}
Перезарядка
) : ( <> {/* Magazine */}
{ammo.magazine} / {ammo.magazineMax}
{/* Тонкая полоска текущей обоймы */}
{/* Reserve + R hint */}
{ammo.reserve} R перезаряд
)}
); }; const HUD_KEYFRAMES = ` @keyframes hudHurtFlash { 0% { opacity: 1; } 100% { opacity: 0; } } @keyframes hudHeartBeat { 0%, 100% { transform: scale(1); } 25%, 75% { transform: scale(1.18); } 50% { transform: scale(0.95); } } @keyframes hudSpin { to { transform: rotate(360deg); } } @keyframes hudPulse { 0%, 100% { opacity: 1; } 50% { opacity: 0.55; } } `; export default PlayerHud;