Llega el monstruo
Lección 9 de 25 del curso Juego de Roblox: Escapa de la oscuridad de Coddy.
Ahora, el monstruo. ServerStorage.Shadow es un modelo alto y oscuro con un Humanoid, así que camina con Humanoid:MoveTo como cualquier NPC.
Cuando se abre la sala Settings.MonsterFrom (4), aparece detrás de los jugadores: en la entrada de la sala situada dos antes de la más reciente. Un bucle por las salas encuentra esa sala mediante su Number:
for _, room in rooms:GetChildren() do
if room:GetAttribute("Number") == count - 2 then
behind = room
end
endEl pivote del modelo está en el centro, así que se coloca 3.1 studs por encima de la entrada para quedar en el suelo. Mantiene la velocidad de Settings.MonsterSpeed en WalkSpeed de su Humanoid.
Desafío
IntermedioEl monstruo aparece detrás de ti.
- Añade
local monster = nilal principio. - Encima de
addRoom, escribespawnMonster(): clonaServerStorage.Shadowenmonster, enEntrance.CFrame + Vector3.new(0, 3.1, 0)de la salacount - 2; WalkSpeedSettings.MonsterSpeed; asígnalo como hijo de workspace. - En
addRoom, llámala cuandocount == Settings.MonsterFrom.
Pulsa «Jugar» y llega hasta la sala 3: la Sombra está dos salas detrás de ti. 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 habitación más reciente
local count = 0 -- habitaciones 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")
-- Una herramienta que lleva un jugador: en la mano o en su Backpack
local function findTool(player, name)
return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end
-- Abre una puerta girándola sobre sus bisagras
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
-- La lección 9: The Monster Comes va aquí
local addRoom -- definida más abajo: una puerta añade una habitación, y una habitación tiene una puerta
-- Lo que 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:GetAttribute("Locked") then
local key = findTool(player, "Key")
if not key then
return
end
key:Destroy()
door:SetAttribute("Locked", nil)
end
if door.Parent == lastRoom then
addRoom()
end
openDoor(door)
end)
end
setupDoor(workspace.Rooms.Lobby.Door)
-- Al entrar en una habitación, esta 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 habitación 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)
-- una habitación cerrada con llave guarda su llave dentro
local keySpot = room:FindFirstChild("KeySpot")
if keySpot then
local key = ServerStorage.Key:Clone()
key.Handle.CFrame = keySpot.CFrame
key.Parent = room
key.Handle.Prompt.Triggered:Connect(function(player)
key.Handle.Prompt.Enabled = false
key.Parent = player.Backpack
end)
end
-- conserva la habitación más reciente y KeepRooms habitaciones anteriores
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)
Todas las lecciones de Juego de Roblox: Escapa de la oscuridad
3El monstruo
Llega el monstruoPractica por tu cuenta: Playground de Roblox