Menu
CoddyTech

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
end

El 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.

challenge icon

Desafío

Intermedio

El monstruo aparece detrás de ti.

  1. Añade local monster = nil al principio.
  2. Encima de addRoom, escribe spawnMonster(): clona ServerStorage.Shadow en monster, en Entrance.CFrame + Vector3.new(0, 3.1, 0) de la sala count - 2; WalkSpeed Settings.MonsterSpeed; asígnalo como hijo de workspace.
  3. En addRoom, llámala cuando count == 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

Practica por tu cuenta: Playground de Roblox