docs(studio): вики задача 40 — карточка #64 + статья «Тренировочный полигон (цифры урона)»

Карточка g5 #64 guide-floaters (openProjectId 2676) + статья: game.fx.
damageFloater, типы (damage/crit/heal/mana/miss), стек stackKey, comicStyle,
object pool. 2 скрина (scene/play) в public/wiki.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
min 2026-06-07 11:08:28 +03:00
parent 458b6c3b59
commit c93070170b
2 changed files with 77 additions and 0 deletions

View File

@ -363,4 +363,9 @@ export const GAMES = [
desc: 'Таблица лидеров справа-сверху (монеты/время/уровень) + всплывающие достижения с редкостью и звуком. Прогресс сохраняется в БД между сессиями.', desc: 'Таблица лидеров справа-сверху (монеты/время/уровень) + всплывающие достижения с редкостью и звуком. Прогресс сохраняется в БД между сессиями.',
mechanics: ['game.leaderstats.define / me.add', 'HUD-таблица топ-10 (сортировка по primary)', 'game.achievements.define / unlock', 'bindToStat — авто-награда по статy', 'toast 4 редкости + очередь', 'кубок → страница достижений', 'сохранение в БД (savegame)'], mechanics: ['game.leaderstats.define / me.add', 'HUD-таблица топ-10 (сортировка по primary)', 'game.achievements.define / unlock', 'bindToStat — авто-награда по статy', 'toast 4 редкости + очередь', 'кубок → страница достижений', 'сохранение в БД (savegame)'],
previewShot: 'guide-leaderstats-scene.png', openProjectId: 2616, ready: true }, previewShot: 'guide-leaderstats-scene.png', openProjectId: 2616, ready: true },
{ id: 'guide-floaters', num: 64, group: 'g5', stars: 2, icon: 'sparkles',
title: 'Тренировочный полигон — цифры урона',
desc: 'Всплывающие цифры урона над целью (как в Roblox-RPG): красный урон, жёлтый крит с pop-эффектом, зелёный хил, синяя мана, серый «Промах», стек «×N» и комикс-стиль BAM!/KAPOW!.',
mechanics: ['game.fx.damageFloater(pos, value, opts)', 'isCrit / isHeal / isMana / isMiss — цвет', 'подъём + плавное затухание + покачивание', 'crit — pop-эффект (scale 1→1.3→1)', 'stackKey — стек одинаковых в «×N»', 'comicStyle — BAM!/KAPOW! на звезде', 'object pool 30 планов (без лагов)'],
previewShot: 'guide-floaters-scene.png', openProjectId: 2676, ready: true },
]; ];

View File

@ -8782,6 +8782,78 @@ game.achievements.unlock('first_coin');`}</Code>
), ),
}, },
'guide-floaters': {
body: (
<>
<h3 className="lessonH">Что получится</h3>
<p>
Тренировочный полигон с манекенами. При ударе над целью
<b> всплывает цифра урона</b> как в Roblox-RPG (Pet Sim, Anime
Adventures): красный обычный урон, жёлтый КРИТ с подскоком,
зелёный хил, синяя мана, серый «Промах». Одинаковые удары
собираются в стек «×N», а в комикс-режиме вместо цифр BAM! и KAPOW!.
</p>
<Shot src="guide-floaters-play.png" wide
caption="Над манекеном всплывают цифры: красный урон, синяя мана «-50», стек «-25 ×10». Цифры поднимаются и плавно гаснут." />
<h3 className="lessonH">Главный метод</h3>
<p>Одна строка рисует всплывающую цифру в нужной точке мира:</p>
<Code>{`game.fx.damageFloater(position, value, opts)`}</Code>
<ul>
<li><b>position</b> точка <code>{'{x,y,z}'}</code>, ссылка на объект или <code>'player'</code>;</li>
<li><b>value</b> число (урон) или строка («Промах», «BLOCKED»);</li>
<li><b>opts</b> стиль: цвет и тип эффекта.</li>
</ul>
<h3 className="lessonH">Типы (цвета)</h3>
<ScriptKind kind="global" />
<Code>{`game.fx.damageFloater(pos, 25); // красный — обычный урон
game.fx.damageFloater(pos, 80, { isCrit: true }); // жёлтый, больше + подскок
game.fx.damageFloater(pos, 30, { isHeal: true }); // зелёный лечение (+30)
game.fx.damageFloater(pos, 50, { isMana: true }); // синий мана
game.fx.damageFloater(pos, 'Промах', { isMiss: true }); // серый текст`}</Code>
<h3 className="lessonH">Стек одинаковых ударов</h3>
<p>
При AOE по одной цели десятки цифр сливаются в кашу. Передай
общий <code>stackKey</code> и удары соберутся в один floater «×N».
</p>
<Code>{`for (let i = 0; i < 10; i++) {
game.fx.damageFloater(enemy.position, 25, { stackKey: 'aoe_' + enemy.id });
}
// один floater «-25 ×10» вместо десяти отдельных`}</Code>
<h3 className="lessonH">Комикс-стиль</h3>
<p>
Для казуальных игр <code>comicStyle: true</code>: вместо чисел
рисуется «BAM!» (урон &gt;50), «KAPOW!» (&gt;100), «POW!» (крит) на
жёлтой звезде-вспышке.
</p>
<Code>{`game.fx.damageFloater(pos, 120, { comicStyle: true }); // KAPOW!`}</Code>
<Note>
Под капотом пул из 30 переиспользуемых билборд-планов
(object pool), поэтому даже при спаме десятков цифр FPS не
проседает. Цифры всегда поверх геометрии и повёрнуты к камере.
</Note>
<h3 className="lessonH">Почему это важно</h3>
<p>
Без всплывающих цифр любой удар ощущается «впустую». Это базовый
боевой фидбек: игрок видит, сколько нанёс, был ли крит, попал ли
вообще. Сочетается с боевыми механиками и способностями.
</p>
<Try>
Сделай «огненный» урон: <code>damageFloater(pos, 15, {'{'} color:
'#ff7a2a' {'}'})</code> каждые 0.5 сек 3 раза подряд эффект
горения (-15 -15 -15).
</Try>
</>
),
},
}; };
/** Есть ли готовый текст урока для игры с таким id. */ /** Есть ли готовый текст урока для игры с таким id. */