데미지 숫자

Damage Numbers

맞은 자리에서 숫자가 튀어 올라 위로 떠오르며 사라지는 연출. 크리티컬은 더 크고 다른 색으로 강조된다.

다른 이름: 플로팅 텍스트Combat text데미지 텍스트
···
html
<div class="dnwrap"><div class="dntarget" id="target"></div><div class="dnlayer" id="layer"></div></div>
css
.dnwrap{position:relative;width:100%;height:100%}
.dntarget{position:absolute;left:50%;top:56%;width:clamp(28px,14vmin,52px);height:clamp(28px,14vmin,52px);margin:-26px 0 0 -26px;border-radius:8px;background:var(--surface);border:2px solid var(--line)}
.dnlayer{position:absolute;inset:0;pointer-events:none}
.dn{position:absolute;left:50%;top:50%;font:800 clamp(13px,4.4vmin,20px)/1 monospace;color:var(--fg);
  transform:translate(-50%,-50%) scale(0.4);opacity:0;transition:transform .5s cubic-bezier(.2,1.4,.4,1), opacity .5s ease-out}
.dn.show{transform:translate(-50%,-160%) scale(1);opacity:1}
.dn.fade{opacity:0;transform:translate(-50%,-260%) scale(0.9)}
.dn.crit{font-size:clamp(18px,6.4vmin,30px);color:var(--accent-2)}
js
const layer=document.getElementById('layer');
const target=document.getElementById('target');
function spawn(val, crit){
  const el=document.createElement('div');
  el.className='dn'+(crit?' crit':'');
  el.textContent=(crit?'-':'-')+val;
  const jitter=(Math.random()*40-20);
  el.style.left='calc(50% + '+jitter+'px)';
  layer.appendChild(el);
  requestAnimationFrame(function(){ el.classList.add('show'); });
  setTimeout(function(){ el.classList.add('fade'); }, 500);
  setTimeout(function(){ el.remove(); }, 950);
  target.style.transform='scale(0.88)';
  setTimeout(function(){ target.style.transform='scale(1)'; }, 90);
}
target.style.transition='transform .12s ease-out';
let n=0;
function tick(){
  n++;
  const crit = n % 3 === 0;
  spawn(crit ? Math.floor(Math.random()*60+80) : Math.floor(Math.random()*20+8), crit);
  setTimeout(tick, crit ? 900 : 550);
}
setTimeout(tick, 400);

데미지 숫자는 맞은 지점(월드 좌표)에서 생성돼 화면 좌표로 투영되고, 위로 떠오르며(translateY) 서서히 투명해지는 짧은 수명의 텍스트다. 생성 즉시 살짝 튀어 오르는 스케일 펀치를 주면 "그냥 나타난다"보다 훨씬 경쾌하게 읽힌다.

일반 타격과 크리티컬을 구분하는 가장 값싼 방법은 크기와 색이다. 크리티컬은 폰트 크기를 1.4~2배 키우고 강조 색을 쓰며, 약간의 회전이나 흔들림을 더해 "이건 평범한 타격이 아니다"를 즉시 구분되게 한다. 같은 자리에서 여러 숫자가 겹치면 뭉개지므로 x축으로 랜덤하게 흩뿌리는 것도 흔한 처리다.

너무 많은 숫자가 한꺼번에 뜨면(광역기, 연속 타격) 화면이 숫자로 뒤덮여 정작 중요한 정보(체력, 위험 신호)를 가린다. 개수를 제한하거나 짧은 시간 안의 타격을 합산해서 하나로 띄우는 처리도 자주 쓴다.

언제 쓰나

전투에 데미지 수치가 있는 게임 전반. 수치가 없는 퍼즐·어드벤처 장르에는 해당 없음.