اللوحة
الدرس 11 من 18 في دورة لعبة Roblox: البرج اللانهائي على Coddy.
تُقام لعبة obby على جولات: انتظار قصير في الردهة، ثم برج جديد وسباق إلى القمة. يحتاج اللاعبون إلى رؤية ما يحدث، لذا تحتوي الردهة على Board، وهو جزء مسطّح يواجه نقطة الظهور.
النص على جزء هو SurfaceGui يحتوي على TextLabel. تجعل UDim2.fromScale(1, 1) التسمية تملأ السطح بالكامل، ويضبط TextScaled حجم الكلمات لتناسبه:
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.Lobby.Board
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.TextScaled = true
label.Text = "Endless Tower"
label.Parent = guiالعدّ التنازلي هو حلقة for تعدّ تنازليًا بخطوة مقدارها -1، مع الانتظار ثانيةً في كل مرة:
for i = 5, 1, -1 do
setBoard("Next tower in " .. i)
task.wait(1)
endالتحدي
متوسط- ضع SurfaceGui على
workspace.Lobby.Boardيحتوي على TextLabel باسمStatusيملؤه، مع تفعيل TextScaled ونص أبيض على خلفية داكنة. - اكتب
setBoard(text)، الذي يضبط خاصية Text للملصق. - قبل بناء البرج، ابدأ العد التنازلي من
Settings.Intermissionحتى 1، مع عرضNext tower in 3، وNext tower in 2، ... والانتظار ثانيةً في كل مرة. ثم ابنِ البرج وابدأ الحمم كما في السابق.
اضغط على Play وراقب اللوحة. ثم اضغط على Check.
جرّب بنفسك
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)
local stages = ServerStorage.Stages
local tower = nil
local lava = nil
print("Each tower has " .. Settings.StageCount .. " stages")
-- يحصل كل لاعب على Wins في لوحة المتصدرين
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Parent = leaderstats
end)
-- أي شيء يحمل الوسم Kill ينهي حياة اللاعب
local function killOnTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- تتلاشى الدرجة المختفية بعد وقت قصير من هبوط أحد عليها، ثم تعود للظهور
local function makeVanish(part)
part.Touched:Connect(function(hit)
if part:GetAttribute("Gone") or not hit.Parent:FindFirstChild("Humanoid") then
return
end
part:SetAttribute("Gone", true)
task.wait(Settings.VanishDelay)
part.Transparency = 0.8
part.CanCollide = false
task.wait(Settings.VanishTime)
part.Transparency = 0
part.CanCollide = true
part:SetAttribute("Gone", nil)
end)
end
-- ينزلق الليزر إلى الموضع المحدد بإزاحة Slide ثم يعود، إلى ما لا نهاية
local function makeSlide(part)
local info = TweenInfo.new(Settings.SlideTime, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, true)
local goal = { Position = part.Position + part:GetAttribute("Slide") }
TweenService:Create(part, info, goal):Play()
end
-- تقذف منصة القفز من يهبط عليها عاليًا في الهواء
local function bounce(hit)
local root = hit.Parent:FindFirstChild("HumanoidRootPart")
if root then
root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
end
end
-- تدور الأجزاء الدوّارة قليلًا في كل إطار
RunService.Heartbeat:Connect(function(dt)
for _, spinner in CollectionService:GetTagged("Spinner") do
if spinner:IsDescendantOf(workspace) then
spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
end
end
end)
-- فعّل كل عائق في مرحلة وفقًا لوسومه
local function setupStage(stage)
for _, part in stage:GetDescendants() do
if part:HasTag("Kill") then
part.Touched:Connect(killOnTouch)
end
if part:HasTag("Vanish") then
makeVanish(part)
end
if part:HasTag("Conveyor") then
part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeed
end
if part:HasTag("Slider") then
makeSlide(part)
end
if part:HasTag("Bounce") then
part.Touched:Connect(bounce)
end
end
end
-- اختر مرحلة عشوائيًا
local function pickStage()
local all = stages:GetChildren()
return all[math.random(1, #all)]
end
-- ضع نسخة من نموذج فوق البرج؛ وأعِد النسخة والارتفاع الجديد لقمة البرج
local function stack(template, bottom)
local copy = template:Clone()
local box, size = copy:GetBoundingBox()
local lift = bottom - (box.Position.Y - size.Y / 2)
copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
copy.Parent = tower
return copy, bottom + size.Y
end
-- ابنِ برجًا عشوائيًا جديدًا من الأسفل إلى الأعلى
local function buildTower()
tower = Instance.new("Model")
tower.Name = "Tower"
tower.Parent = workspace
local top = 0
for i = 1, Settings.StageCount do
local stage, newTop = stack(pickStage(), top)
top = newTop
setupStage(stage)
end
stack(ServerStorage.Finish, top)
return top
end
-- ترتفع الحمم من الأرض إلى ما دون قمة البرج مباشرةً
local function startLava(top)
lava = Instance.new("Part")
lava.Name = "Lava"
lava.Anchored = true
lava.CanCollide = false
lava.Size = Vector3.new(30, 2, 30)
lava.Position = Vector3.new(0, -2, 0)
lava.Color = Color3.fromRGB(255, 90, 20)
lava.Material = Enum.Material.Neon
lava.Parent = workspace
lava.Touched:Connect(killOnTouch)
local info = TweenInfo.new(top / Settings.LavaSpeed, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)
TweenService:Create(lava, info, { Position = Vector3.new(0, top - 2, 0) }):Play()
end
local top = buildTower()
startLava(top)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.