الدرجات المتلاشية
الدرس 6 من 18 في دورة لعبة Roblox: البرج اللانهائي على Coddy.
تتلاشى الدرجات الزجاجية الموسومة بـ Vanish بعد وقت قصير من هبوطك على إحداها، ثم تعود. يمكن المرور عبر جزء تكون فيه CanCollide متوقفة، ومع قيمة Transparency عالية يبدو كأنه اختفى:
part.Transparency = 0.8
part.CanCollide = falseيُطلَق الحدث Touched مع كل طرف يلمس الدرجة، ومرة أخرى أثناء سقوطك عبرها. من دون فحص، يبدأ كل لمس عملية تلاشي خاصة به، وتستمر الدرجة في الوميض طويلًا بعد أن تكون قد غادرت. تتيح آلية منع التكرار مرور اللمسة الأولى فقط: ضع علامة على الدرجة أثناء انشغالها، وتجاهل اللمسات ما دامت العلامة موجودة.
if part:GetAttribute("Gone") then
return
end
part:SetAttribute("Gone", true)
-- تلاشى، انتظر، ثم عُد
part:SetAttribute("Gone", nil)يحدث الانتظار داخل دالة Touched، التي يشغّلها Roblox بشكل مستقل، لذا فهو لا يعيق بقية اللعبة أبدًا.
التحدي
متوسطاكتب makeVanish(part) واستخدمها مع كل جزء يحمل الوسم Vanish في setupStage. عندما يلمس كائن لديه Humanoid الدرجة، ويكون الجزء غير مختفٍ بالفعل:
- اضبط السمة
Goneعلى true. - انتظر
Settings.VanishDelay، ثم اضبط Transparency على 0.8 وCanCollide على false. - انتظر
Settings.VanishTime، ثم أعدهما إلى 0 وtrue، وامسحGone(اضبطها على nil).
اضغط Play واستمر في التحرك. ثم اضغط Check.
جرّب بنفسك
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local Settings = require(game.ReplicatedStorage.Settings)
local stages = ServerStorage.Stages
local tower = 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
-- تدور العناصر الدوّارة قليلًا في كل إطار
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
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)
end
buildTower()
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.