feat: 50 игр на Lua + импорт Roblox для всех + поддержка Lua в плеере #39

Merged
min merged 215 commits from feat/lua-50-games-bundle into main 2026-06-09 21:59:25 +00:00
Showing only changes of commit 61026a1df0 - Show all commits

View File

@ -1,6 +1,6 @@
import React from 'react'; import React from 'react';
import { Code, ScriptKind, Step, Note, Try, Shot } from './docsData'; import { Code, ScriptKind, Step, Note, Try, Shot } from './docsData';
import { LangTabs } from './docsLang'; import { LangTabs, useDocsLang } from './docsLang';
import { LUA_OVERRIDES } from './docsGamesBuildersLua'; import { LUA_OVERRIDES } from './docsGamesBuildersLua';
/** /**
@ -20,6 +20,17 @@ function CodeBoth({ game, script, children }) {
); );
} }
/**
* Инлайн-API-имена в тексте уроков, меняющиеся в зависимости от JS/Lua вкладки.
* <Api js="game.ui.showText('Победа!', 5)" lua={'__rbxl_show_text("Победа!", 5)'} />
* Если lua не задан показывает js в обоих режимах.
*/
function Api({ js, lua }) {
const { lang } = useDocsLang();
const txt = lang === 'lua' && lua ? lua : js;
return <code>{txt}</code>;
}
/** /**
* docsLessons.jsx тексты уроков для 50 мини-игр (раздел K вики). * docsLessons.jsx тексты уроков для 50 мини-игр (раздел K вики).
* *
@ -7270,8 +7281,10 @@ game.self.onTouch(() => {
</ul> </ul>
<p> <p>
И обязательно покажи игроку, когда он <b>победил</b> И обязательно покажи игроку, когда он <b>победил</b>
надписью <code>game.ui.showText('Победа!', 5)</code>, надписью <Api js="game.ui.showText('Победа!', 5)"
звуком <code>game.sound.play('win')</code> и конфетти. lua={'__rbxl_show_text("Победа!", 5)'} />,
звуком <Api js="game.sound.play('win')"
lua={'winSound:Play()'} /> и конфетти.
</p> </p>
<h3 className="lessonH">Шаг 4. Напиши скрипты</h3> <h3 className="lessonH">Шаг 4. Напиши скрипты</h3>
@ -7279,34 +7292,48 @@ game.self.onTouch(() => {
Сцена сама по себе не «живая» её оживляют скрипты. Сцена сама по себе не «живая» её оживляют скрипты.
Начинай с <b>главного скрипта</b>: в нём заводи переменные Начинай с <b>главного скрипта</b>: в нём заводи переменные
(счёт, флажок победы) и <b>лови сообщения</b> через (счёт, флажок победы) и <b>лови сообщения</b> через
<code> game.onMessage('имя', fn)</code>. На объекты вешай <> </><Api js="game.onMessage('имя', fn)"
небольшие скрипты они шлют сообщения главному через lua={'getEvent("Имя").Event:Connect(fn)'} />.
<code> game.broadcast('имя')</code>. Так главный скрипт На объекты вешай небольшие скрипты они шлют сообщения
узнаёт, что монетку собрали или кнопку нажали. Ты делал главному через <Api js="game.broadcast('имя')"
так в каждом уроке. lua={'getEvent("Имя"):Fire()'} />.
Так главный скрипт узнаёт, что монетку собрали или кнопку
нажали. Ты делал так в каждом уроке.
</p> </p>
<Note> <Note>
Каждый скрипт работает в своей «песочнице» переменные Каждый скрипт работает в своей «песочнице» переменные
одного скрипта не видны другому. Поэтому скрипты общаются одного скрипта не видны другому. Поэтому скрипты общаются
сообщениями: один шлёт <code>game.broadcast('имя')</code>, сообщениями: один шлёт <Api js="game.broadcast('имя')"
другой ловит <code>game.onMessage('имя', fn)</code>. Можно lua={'getEvent("Имя"):Fire()'} />,
передать данные: <code>game.broadcast('имя', {'{'} ... {'}'})</code>. другой ловит <Api js="game.onMessage('имя', fn)"
lua={'getEvent("Имя").Event:Connect(fn)'} />.
Можно передать данные: <Api
js="game.broadcast('имя', { ... })"
lua={'getEvent("Имя"):Fire(data)'} />.
</Note> </Note>
<p>Базовый набор инструментов, который ты знаешь:</p> <p>Базовый набор инструментов, который ты знаешь:</p>
<ul> <ul>
<li><code>game.self.onTouch</code> реакция на касание;</li> <li><Api js="game.self.onTouch"
<li><code>game.self.onInteract</code> реакция на lua={'part.Touched:Connect(fn)'} /> реакция на касание;</li>
<li><Api js="game.self.onInteract"
lua={'UserInputService.InputBegan + Heartbeat (дистанция)'} /> реакция на
<kbd className="kbd">E</kbd>;</li> <kbd className="kbd">E</kbd>;</li>
<li><code>game.self.onClick</code> реакция на клик;</li> <li><Api js="game.self.onClick"
<li><code>game.broadcast</code> и <code>game.onMessage</code> lua={'ClickDetector + MouseClick:Connect'} /> реакция на клик;</li>
<li><Api js="game.broadcast" lua={'BindableEvent:Fire'} /> и
<> </><Api js="game.onMessage" lua={'BindableEvent.Event:Connect'} />
связь между скриптами;</li> связь между скриптами;</li>
<li><code>game.onTick</code> каждый кадр;</li> <li><Api js="game.onTick"
<li><code>game.after</code> и <code>game.every</code> lua={'RunService.Heartbeat:Connect'} /> каждый кадр;</li>
таймеры;</li> <li><Api js="game.after / game.every"
<li><code>game.tween</code> плавное движение;</li> lua={'task.delay / task.spawn'} /> таймеры;</li>
<li><code>game.scene.spawnNpc</code> враги и NPC;</li> <li><Api js="game.tween"
<li><code>game.ui.score</code> и lua={'TweenService:Create(part, TweenInfo.new(t), goal):Play()'} /> плавное движение;</li>
<code> game.ui.showText</code> счёт и подсказки.</li> <li><Api js="game.scene.spawnNpc"
lua={'__rbxl_spawn_npc("character-b", x, y, z, name, hp, speed)'} /> враги и NPC;</li>
<li><Api js="game.ui.score" lua={'__rbxl_score_set(N)'} /> и
<> </><Api js="game.ui.showText"
lua={'__rbxl_show_text(text, duration)'} /> счёт и подсказки.</li>
</ul> </ul>
<h3 className="lessonH">Шаг 5. Проверяй и улучшай</h3> <h3 className="lessonH">Шаг 5. Проверяй и улучшай</h3>