رتّب المكان
الدرس 7 من 20 في دورة لعبة Roblox: اهرب من الظلام على Coddy.
كل باب يضيف غرفة، ولا تختفي أي غرفة أبدًا: فالجولة الطويلة ستملأ اللعبة بغرف لن يراها أحد مجددًا. احتفظ بأحدث غرفة وبالغرف Settings.KeepRooms التي تسبقها، ودمّر الباقي:
for _, old in rooms:GetChildren() do
if old:GetAttribute("Number") < count - Settings.KeepRooms then
old:Destroy()
end
endالردهة هي الغرفة 0، لذا ستُزال هي أيضًا عندما يبتعد اللاعب بما يكفي. أما الغرف التي يمكن للاعبين الوصول إليها فستبقى.
التحدي
متوسطفي نهاية addRoom، وقبل أن تُرجع قيمة، دمّر كل غرفة رقمها أقل من count - Settings.KeepRooms.
اضغط على Play، ثم Check.
جرّب بنفسك
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Lighting = game:GetService("Lighting")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)
local rooms = workspace.Rooms
local lastRoom = rooms.Lobby -- الغرفة الأحدث
local count = 0 -- الغرف التي أُنشئت حتى الآن
-- يحلّ الليل: لا شمس، وقليل من الضوء في كل مكان، وضباب
Lighting.ClockTime = Settings.ClockTime
Lighting.Ambient = Settings.Ambient
Lighting.OutdoorAmbient = Settings.Ambient
Lighting.FogColor = Color3.new(0, 0, 0)
Lighting.FogEnd = Settings.FogEnd
print("Lights out")
-- افتح الباب بتدويره حول مفصلته
local function openDoor(door)
door:SetAttribute("Open", true)
door.Panel.Prompt.Enabled = false
local hinge, panel = door.Hinge, door.Panel
local goal = hinge.CFrame * CFrame.Angles(0, math.rad(90), 0) * hinge.CFrame:ToObjectSpace(panel.CFrame)
TweenService:Create(panel, TweenInfo.new(0.6), { CFrame = goal }):Play()
end
local addRoom -- مُعرّفة أدناه: الباب يضيف غرفة، ولكل غرفة باب
-- ما يفعله الباب عندما يفتحه لاعب
local function setupDoor(door)
door.Panel.Prompt.Triggered:Connect(function(player)
if door:GetAttribute("Open") then
return
end
if door.Parent == lastRoom then
addRoom()
end
openDoor(door)
end)
end
setupDoor(workspace.Rooms.Lobby.Door)
-- عند دخول غرفة: تصبح هي Room الخاصة باللاعب ونقطة عودته
local function setupEntry(room)
room.Entry.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
local number = room:GetAttribute("Number")
player.leaderstats.Room.Value = number
player.RespawnLocation = room.Checkpoint
end
end)
end
setupEntry(workspace.Rooms.Lobby)
-- غرفة جديدة عند مخرج الغرفة الأحدث
function addRoom()
count += 1
local name = Settings.Order[(count - 1) % #Settings.Order + 1]
if count >= Settings.RoomsToEscape then
name = "Exit"
end
local room = ServerStorage.Rooms[name]:Clone()
room:PivotTo(lastRoom.Exit.CFrame)
room:SetAttribute("Number", count)
room.Sign.SurfaceGui.Number.Text = "Room " .. count
room.Parent = rooms
lastRoom = room
setupDoor(room.Door)
setupEntry(room)
return room
end
-- لكل لاعب: Room في لوحة الصدارة، ومصباح يدوي مع كل حياة
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local room = Instance.new("IntValue")
room.Name = "Room"
room.Parent = leaderstats
player.CharacterAdded:Connect(function()
local flashlight = ServerStorage.Flashlight:Clone()
flashlight.Parent = player.Backpack
local beam = flashlight.Handle.Beam
flashlight.Activated:Connect(function()
beam.Enabled = not beam.Enabled
end)
end)
end)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.