Menu
CoddyTech

Cammina

Lezione 10 di 25 del corso Gioco Roblox: Fuga dal buio di Coddy.

L'Ombra resta immobile. La sua mente è un ciclo: ogni quarto di secondo, cammina verso il giocatore vivente più vicino. Il ciclo non finisce mai, quindi viene eseguito nel proprio thread con task.spawn, mentre addRoom prosegue subito.

local function runMonster(shadow)
	while shadow.Parent do
		-- trova qualcuno e cammina verso di lui
		task.wait(0.25)
	end
end

task.spawn(runMonster, monster)

while shadow.Parent interrompe il ciclo quando il mostro viene distrutto.

challenge icon

Sfida

Medio

Fai camminare lo Shadow verso di te.

  1. Scrivi nearestCharacter(position): il personaggio del giocatore vivente più vicino e la sua distanza.
  2. Scrivi runMonster(shadow): finché shadow.Parent, usa MoveTo per raggiungere HumanoidRootPart.Position del personaggio più vicino, quindi esegui task.wait(0.25).
  3. Alla fine di spawnMonster, aggiungi task.spawn(runMonster, monster).

Premi «Gioca» e supera la stanza 3: lo Shadow viene dritto verso di te. Poi premi «Verifica».

Provalo tu

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 stanza più recente
local count = 0 -- stanze create finora
local monster = nil

-- Cala la notte: niente sole, un po' di luce ovunque e nebbia
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")

-- Uno strumento che un giocatore porta con sé: in mano o nel suo Backpack
local function findTool(player, name)
	return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end

-- Apri una porta facendola ruotare sui cardini
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

-- Lezione 10: It Walks va qui

-- Il mostro arriva alle tue spalle: all'ingresso della stanza che precede di due posizioni la più recente
local function spawnMonster()
	local behind = nil
	for _, room in rooms:GetChildren() do
		if room:GetAttribute("Number") == count - 2 then
			behind = room
		end
	end
	if not behind then
		return
	end
	monster = ServerStorage.Shadow:Clone()
	monster:PivotTo(behind.Entrance.CFrame + Vector3.new(0, 3.1, 0))
	monster.Humanoid.WalkSpeed = Settings.MonsterSpeed
	monster.Parent = workspace
end

local addRoom -- definito più sotto: una porta aggiunge una stanza, e una stanza ha una porta

-- Cosa fa una porta quando un giocatore la apre
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)

-- Entrando in una stanza: diventa la Room del giocatore e il suo checkpoint
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 nuova stanza all'uscita di quella più recente
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 stanza chiusa a chiave tiene la sua chiave al suo interno
	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
	-- mantieni la stanza più recente e KeepRooms stanze precedenti
	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
	if count == Settings.MonsterFrom then
		spawnMonster()
	end
	return room
end

-- Ogni giocatore: Room nella classifica e una torcia a ogni nuova vita
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)

Tutte le lezioni di Gioco Roblox: Fuga dal buio

Esercitati da solo: Playground Roblox