docs(studio): вики задача 40 — обновлена под зомби-арену (бластер + autoMobFloaters + волны)

Карточка #64 «Зомби-арена — бластер и цифры урона» + статья переписана:
giveTool бластер, autoMobFloaters (авто-облачко над мобами), spawnNpc+follow
волны зомби, прицел в точку клика, ручной damageFloater (типы/стек/комикс).
Новые скрины scene/play (зомби-шутер).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
min 2026-06-07 14:18:53 +03:00
parent 931d53b4d9
commit c20ac56895
2 changed files with 54 additions and 41 deletions

View File

@ -364,8 +364,8 @@ export const GAMES = [
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 },
{ 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 планов (без лагов)'],
title: 'Зомби-арена — бластер и цифры урона',
desc: 'Шутер: волны зомби бегут к игроку, бластер их отстреливает, над целью всплывают облачка урона. Авто-floater над любым мобом одной строкой + ручной game.fx.damageFloater (крит/хил/мана/промах/стек/комикс).',
mechanics: ['game.fx.damageFloater(pos, value, opts)', 'game.fx.autoMobFloaters(true) — облачко над NPC при уроне', 'game.player.giveTool(\'blaster-...\') — бластер', 'бластер от 3-го лица — в точку клика', 'spawnNpc + follow(\'player\') — зомби-волны', 'isCrit/isHeal/isMana/isMiss, стек ×N, комикс', 'object pool 30 планов (без лагов)'],
previewShot: 'guide-floaters-scene.png', openProjectId: 2676, ready: true },
];

View File

@ -8787,68 +8787,81 @@ game.achievements.unlock('first_coin');`}</Code>
<>
<h3 className="lessonH">Что получится</h3>
<p>
Тренировочный полигон с манекенами. При ударе над целью
<b> всплывает цифра урона</b> как в Roblox-RPG (Pet Sim, Anime
Adventures): красный обычный урон, жёлтый КРИТ с подскоком,
зелёный хил, синяя мана, серый «Промах». Одинаковые удары
собираются в стек «×N», а в комикс-режиме вместо цифр BAM! и KAPOW!.
Мини-шутер: волны <b>зомби бегут к игроку</b>, ты отстреливаешь
их из <b>бластера</b>, а над каждой целью всплывает <b>облачко
урона</b> как в Roblox-RPG (Pet Sim, Anime Adventures). Зомби
гибнут, счётчик растёт, волны усиливаются.
</p>
<Shot src="guide-floaters-play.png" wide
caption="Над манекеном всплывают цифры: красный урон, синяя мана «-50», стек «-25 ×10». Цифры поднимаются и плавно гаснут." />
<Shot src="guide-floaters-scene.png" wide
caption="Волна зомби сбегается к игроку. Бластер в руках, над целями всплывают цифры урона." />
<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>
<h3 className="lessonH">Шаг 1. Бластер + авто-облачка над мобами</h3>
<p>
Две строки превращают игру в шутер с фидбеком урона: выдаём
бластер и включаем <b>авто-floater</b> теперь <i>любой</i> урон
по NPC сам рисует «-N» над целью, вручную вызывать ничего не надо.
</p>
<ScriptKind kind="global" />
<Code>{`game.player.giveTool('blaster-blaster-a', { equip: true }); // бластер в руки
game.fx.autoMobFloaters(true); // облачко урона над любым мобом при попадании`}</Code>
<h3 className="lessonH">Шаг 2. Волны зомби, идущих к игроку</h3>
<Code>{`function spawnWave(n){
const pl = game.player.position;
for (let i = 0; i < n; i++){
const a = (i / n) * Math.PI * 2;
const e = game.scene.spawnNpc('skin_retro-zombie', {
x: pl.x + Math.cos(a)*18, z: pl.z + Math.sin(a)*18,
name: 'Зомби', hp: 100, speed: 2.6,
});
if (e && e.follow) e.follow('player'); // зомби преследует игрока
}
}
game.after(1.5, () => spawnWave(5));
game.every(14, () => spawnWave(8));`}</Code>
<p>
Стрелять из бластера ЛКМ. В режиме от 3-го лица пуля летит
<b> туда, куда кликнул</b> курсором. Попал по зомби облачко
урона (благодаря <code>autoMobFloaters</code>), убил засчитан.
</p>
<h3 className="lessonH">Ручной floater все типы</h3>
<p>Когда нужен полный контроль рисуй цифру сам:</p>
<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».
<b>position</b> <code>{'{x,y,z}'}</code>, ссылка на объект или
<code>'player'</code>; <b>value</b> число или строка.
</p>
<Code>{`for (let i = 0; i < 10; i++) {
<h3 className="lessonH">Стек и комикс-стиль</h3>
<Code>{`// общий stackKey → удары сливаются в «-25 ×N» вместо кучи цифр
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>
// comicStyle BAM! (>50), KAPOW! (>100), POW! (крит) на жёлтой звезде
game.fx.damageFloater(pos, 120, { comicStyle: true });`}</Code>
<Note>
Под капотом пул из 30 переиспользуемых билборд-планов
(object pool), поэтому даже при спаме десятков цифр FPS не
(object pool), поэтому даже при толпе зомби и спаме цифр FPS не
проседает. Цифры всегда поверх геометрии и повёрнуты к камере.
</Note>
<h3 className="lessonH">Почему это важно</h3>
<p>
Без всплывающих цифр любой удар ощущается «впустую». Это базовый
боевой фидбек: игрок видит, сколько нанёс, был ли крит, попал ли
вообще. Сочетается с боевыми механиками и способностями.
Без облачек урона стрельба ощущается «впустую». Это базовый
боевой фидбек: игрок видит, сколько нанёс, был ли крит, попал ли.
Связка <code>бластер + autoMobFloaters + волны NPC</code> готовый
каркас любого шутера/выживания.
</p>
<Try>
Сделай «огненный» урон: <code>damageFloater(pos, 15, {'{'} color:
'#ff7a2a' {'}'})</code> каждые 0.5 сек 3 раза подряд эффект
горения (-15 -15 -15).
'#ff7a2a' {'}'})</code> каждые 0.5 сек 3 раза эффект горения.
Или увеличь HP зомби и добавь крит каждый 5-й выстрел.
</Try>
</>
),