المفاتيح والأقفال
الدرس 8 من 20 في دورة لعبة Roblox: اهرب من الظلام على Coddy.
بعض الغرف مقفلة (القالب Locked): بابها يحمل السمة Locked، والمفتاح موجود في مكان ما بداخلها، عند KeySpot. المفتاح أداة؛ يؤدي الضغط على المطالبة إلى وضعه في حقيبة ظهر اللاعب.
لا يُفتح الباب المقفل إلا للاعب الذي يحمل المفتاح، سواء في يده (داخل شخصيته) أو في حقيبة ظهره. ويستهلك الباب المفتاح:
local key = findTool(player, "Key")
if not key then
return
end
key:Destroy()
door:SetAttribute("Locked", nil)التحدي
متوسط- اكتب
findTool(player, name): الأداة الموجودة في شخصية اللاعب أو في حقيبة ظهره. - في
addRoom، إذا كانت الغرفة تحتوي علىKeySpot، فضع نسخة منهServerStorage.Keyهناك (key.Handle.CFrame = spot.CFrame، واجعل الغرفة هي العنصر الأب له)؛ يقومHandle.Promptبإيقاف نفسه ونقل المفتاح إلى حقيبة ظهر اللاعب. - في
setupDoor، قبل فتح الباب: يحتاج الباب المقفل إلى المفتاح، ويستهلكه ويفقد السمةLocked.
اضغط على Play واجتز الغرفة 3. ثم اضغط على 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)
-- احتفظ بأحدث غرفة وKeepRooms غرفةً خلفها
for _, old in rooms:GetChildren() do
if old:GetAttribute("Number") < count - Settings.KeepRooms then
old:Destroy()
end
end
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)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.