Menu
CoddyTech

Clés et serrures

Leçon 8 sur 20 du cours Jeu Roblox : Échapper aux ténèbres de Coddy.

Certaines pièces sont verrouillées (le modèle Locked) : leur porte possède l’attribut Locked, et la clé se trouve quelque part à l’intérieur, à un KeySpot. La clé est un Tool ; appuyer sur son invite la place dans le Backpack du joueur.

Une porte verrouillée ne s’ouvre que pour un joueur qui porte la clé, dans sa main (dans son personnage) ou dans son Backpack. La porte la consomme :

local key = findTool(player, "Key")
if not key then
	return
end
key:Destroy()
door:SetAttribute("Locked", nil)
challenge icon

Défi

Moyen
  1. Écrivez findTool(player, name) : l’outil dans son personnage ou dans son Backpack.
  2. Dans addRoom, si la pièce a un KeySpot, placez-y un clone de ServerStorage.Key (key.Handle.CFrame = spot.CFrame, avec la pièce comme parent) ; son Handle.Prompt se désactive et déplace la clé dans le Backpack du joueur.
  3. Dans setupDoor, avant que la porte ne s’ouvre : une porte verrouillée nécessite la clé, la consomme et perd son attribut Locked.

Appuyez sur Play et traversez la pièce 3. Puis cliquez sur Check.

Essayez vous-même

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 -- la salle la plus récente
local count = 0 -- nombre de salles créées jusqu’ici

-- La nuit tombe : plus de soleil, un peu de lumière partout et du brouillard
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")

-- Ouvrir une porte en la faisant pivoter sur ses gonds
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 -- défini plus bas : une porte ajoute une salle, et chaque salle a une porte

-- Ce qui se passe lorsqu’un joueur ouvre une porte
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)

-- Entrer dans une salle : elle devient la Room du joueur et son point de réapparition
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)

-- Une nouvelle salle à la sortie de la plus récente
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)
	-- conserver la salle la plus récente et KeepRooms salles derrière elle
	for _, old in rooms:GetChildren() do
		if old:GetAttribute("Number") < count - Settings.KeepRooms then
			old:Destroy()
		end
	end
	return room
end

-- Pour chaque joueur : Room dans le classement et une lampe torche à chaque vie
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)
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Roblox : Échapper aux ténèbres