Llaves y cerraduras
Lección 8 de 25 del curso Juego de Roblox: Escapa de la oscuridad de Coddy.
Algunas habitaciones están cerradas con llave (la plantilla Locked): su puerta tiene el atributo Locked, y la llave está en algún lugar del interior, en un KeySpot. La llave es una herramienta; al pulsar su indicador, se guarda en la mochila del jugador.
Una puerta cerrada con llave solo se abre para un jugador que lleve la llave, en la mano (en su personaje) o en su mochila. La puerta la consume:
local key = findTool(player, "Key")
if not key then
return
end
key:Destroy()
door:SetAttribute("Locked", nil)Desafío
IntermedioMantén las puertas cerradas hasta que encuentres su llave.
findTool(player, name): la herramienta en su Character; si no, en su Backpack.addRoomcoloca una copia deServerStorage.Keyen una habitación que tenga unKeySpot:key.Handle.CFrame = keySpot.CFrame.- Su
Handle.Promptse desactiva y la herramienta se mueve al Backpack del jugador. - En
setupDoor, una puertaLockednecesita la llave: destrúyela y eliminaLocked.
Pulsa «Jugar» y llega a la habitación 3: su puerta necesita su llave. Después, pulsa «Comprobar».
Pruébalo tú mismo
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 sala más reciente
local count = 0 -- salas creadas hasta ahora
-- Cae la noche: no hay sol, hay un poco de luz por todas partes y niebla
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")
-- Abre una puerta girándola sobre su bisagra
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 -- definida más abajo: una puerta añade una sala, y una sala tiene una puerta
-- Qué hace una puerta cuando un jugador la abre
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)
-- Al entrar en una sala: se convierte en la Room del jugador y en su punto de control
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)
-- Una sala nueva a la salida de la más reciente
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)
-- La lección 8: Llaves y cerraduras va aquí
-- conserva la sala más reciente y KeepRooms salas detrás de ella
for _, old in rooms:GetChildren() do
local number = old:GetAttribute("Number")
if number < count - Settings.KeepRooms then
print("Room " .. number .. " is gone")
old:Destroy()
end
end
return room
end
-- Cada jugador: Room en la tabla de clasificación y una linterna en cada vida
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)
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Roblox: Escapa de la oscuridad
Practica por tu cuenta: Playground de Roblox