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 e3bff777b2 - Show all commits

View File

@ -1013,35 +1013,55 @@ game.self.onUntouch(() => {
<>
<p>
Нарисованная кнопка сама по себе ничего не делает
нужен скрипт. Самый простой способ повесить скрипт
прямо на кнопку.
нужен скрипт.
</p>
<ScriptKind kind="object" on="кнопку" />
<Code>{`// Скрипт висит на кнопке.
<LangTabs
js={<Code>{`// Скрипт висит на кнопке.
// game.self это сама кнопка.
game.self.onClick(() => {
game.ui.showText('Кнопка нажата!', 2);
game.sound.play('click');
});`}</Code>
<p>
Можно и наоборот управлять кнопкой из глобального
скрипта, если найти её по имени:
</p>
});`}</Code>}
lua={<Code>{`-- Скрипт висит на кнопке (TextButton)
-- script.Parent это сама кнопка.
local btn = script.Parent
btn.MouseButton1Click:Connect(function()
print("Кнопка нажата!")
end)`}</Code>}
/>
<p>Можно и наоборот управлять кнопкой из глобального скрипта:</p>
<ScriptKind kind="global" />
<Code>{`// Находим кнопку по имени и вешаем на неё клик
<LangTabs
js={<Code>{`// Находим кнопку по имени и вешаем на неё клик
const btnId = game.gui.find('Кнопка старта');
game.gui.onClick(btnId, () => {
game.ui.showText('Игра началась!', 2);
// спрятать кнопку после нажатия
game.gui.hide(btnId);
});`}</Code>
game.gui.hide(btnId); // спрятать кнопку после нажатия
});`}</Code>}
lua={<Code>{`local Players = game:GetService("Players")
local player = Players.LocalPlayer
local gui = player:WaitForChild("PlayerGui")
-- Находим кнопку по имени (она лежит где-то в PlayerGui)
local btn = gui:FindFirstChild("Кнопка старта", true)
btn.MouseButton1Click:Connect(function()
print("Игра началась!")
btn.Visible = false -- спрятать кнопку
end)`}</Code>}
/>
<p>
Что тут происходит: <code>game.gui.find</code> ищет
элемент по имени и возвращает его id («адрес»).
<code> game.gui.onClick</code> вешает на этот id действие.
<code> game.gui.hide</code> прячет кнопку, чтобы её нельзя
было нажать второй раз.
JS: <code>game.gui.find</code> ищет элемент по имени.
<code> game.gui.onClick</code> вешает действие, <code>game.gui.hide</code> прячет.
</p>
<p>
Lua: <code>gui:FindFirstChild(name, true)</code> ищет рекурсивно
(третий аргумент <code>true</code> = во вложенных).
<code> MouseButton1Click</code> стандартный сигнал клика на TextButton.
<code> btn.Visible = false</code> прячет элемент.
</p>
</>
),
@ -1053,34 +1073,59 @@ game.gui.onClick(btnId, () => {
<>
<p>
<b>Поле ввода</b> позволяет игроку напечатать ответ.
Когда он нажмёт Enter, срабатывает событие
<code> onSubmit</code> и скрипт получает введённый текст.
Когда он нажмёт Enter, скрипт получает введённый текст.
</p>
<ScriptKind kind="global" />
<Code>{`// Игрок вводит код. Правильный код — 1234.
<LangTabs
js={<Code>{`// Игрок вводит код. Правильный код — 1234.
const boxId = game.gui.find('Поле кода');
game.gui.onSubmit(boxId, (text) => {
if (text === '1234') {
game.ui.showText('Верно! Дверь открыта', 2);
// двигаем дверь вверх, чтобы освободить проход
const door = game.scene.findOne('Дверь');
game.tween(door, { y: 8 }, { duration: 1 });
} else {
game.ui.showText('Неверный код', 1.5);
}
});`}</Code>
});`}</Code>}
lua={<Code>{`local Players = game:GetService("Players")
local TweenService = game:GetService("TweenService")
local player = Players.LocalPlayer
local gui = player:WaitForChild("PlayerGui")
-- Находим TextBox по имени
local box = gui:FindFirstChild("Поле кода", true)
-- FocusLost срабатывает когда игрок нажал Enter или ушёл с поля.
-- Первый параметр enterPressed = true только если был Enter.
box.FocusLost:Connect(function(enterPressed)
if not enterPressed then return end
if box.Text == "1234" then
print("Верно! Дверь открыта")
local door = workspace:WaitForChild("Дверь")
local goal = { Position = door.Position + Vector3.new(0, 8, 0) }
TweenService:Create(door, TweenInfo.new(1), goal):Play()
else
print("Неверный код")
end
end)`}</Code>}
/>
<p>
Разберём построчно: <code>onSubmit</code> даёт переменную
<code> text</code> это то, что напечатал игрок.
<code> if (text === '1234')</code> проверяем, совпал ли
код. Если да открываем дверь твином (плавно поднимаем).
Если нет пишем «Неверный код».
JS-разбор: <code>onSubmit</code> даёт переменную
<code> text</code> то, что напечатал игрок.
<code> if (text === '1234')</code> проверяем код.
</p>
<p>
Lua-разбор: на TextBox сигнал <code>FocusLost</code>
срабатывает когда поле теряет фокус (Enter или клик мимо).
Текст лежит в <code>box.Text</code>.
</p>
<Note>
Две одинарные кавычки <code>'1234'</code> означают,
что это <b>текст</b>, а не число. Игрок печатает в поле
всегда текст, поэтому и сравнивать нужно с текстом.
Кавычки <code>"1234"</code> означают, что это
<b> текст</b>, а не число. Игрок печатает в поле всегда
текст, поэтому и сравнивать нужно с текстом.
</Note>
</>
),