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:
parent
931d53b4d9
commit
c20ac56895
@ -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 },
|
||||
];
|
||||
|
||||
@ -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!» (урон >50), «KAPOW!» (>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>
|
||||
</>
|
||||
),
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user