Menu
CoddyTech

Nadchodzi potwór

Lekcja 9 z 25 w kursie Gra Roblox: Ucieczka z ciemności w Coddy.

Teraz potwór. ServerStorage.Shadow to wysoki, ciemny model z Humanoidem, więc porusza się za pomocą Humanoid:MoveTo, tak jak każdy NPC.

Gdy otwiera się pokój Settings.MonsterFrom (4), potwór pojawia się za graczami: przy wejściu do pokoju znajdującego się dwa pokoje przed najnowszym. Pętla po pokojach znajduje ten pokój na podstawie jego Number:

for _, room in rooms:GetChildren() do
	if room:GetAttribute("Number") == count - 2 then
		behind = room
	end
end

Punkt obrotu modelu znajduje się pośrodku, więc model jest umieszczany 3.1 studa nad wejściem, aby stanąć na podłodze. Prędkość potwora jest ustawiona na Settings.MonsterSpeed we właściwości WalkSpeed jego Humanoida.

challenge icon

Wyzwanie

Średni

Potwór pojawia się za tobą.

  1. Na górze dodaj local monster = nil.
  2. Nad addRoom napisz spawnMonster(): sklonuj ServerStorage.Shadow do monster przy Entrance.CFrame + Vector3.new(0, 3.1, 0) pokoju count - 2; ustaw WalkSpeed na Settings.MonsterSpeed; ustaw jego parent na workspace.
  3. W addRoom wywołaj tę funkcję, gdy count == Settings.MonsterFrom.

Naciśnij „Graj” i przejdź przez pokój 3: Shadow stoi dwa pokoje za tobą. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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 -- najnowszy pokój
local count = 0 -- pokoje utworzone do tej pory

-- Zapada noc: nie ma słońca, wszędzie jest trochę światła i mgła
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")

-- Przedmiot noszony przez gracza: w dłoni lub w jego Backpack
local function findTool(player, name)
	return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end

-- Otwórz drzwi, obracając je na zawiasie
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

-- Tu należy umieścić Lesson 9: The Monster Comes

local addRoom -- zdefiniowane poniżej: drzwi dodają pokój, a pokój ma drzwi

-- Co się dzieje z drzwiami, gdy gracz je otwiera
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)

-- Wejście do pokoju: staje się on pokojem gracza w Room i jego punktem odrodzenia
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)

-- Nowy pokój przy wyjściu z najnowszego pokoju
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)
	-- zamknięty pokój przechowuje swój klucz w środku
	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
	-- zachowaj najnowszy pokój i KeepRooms pokoi za nim
	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

-- Każdy gracz: Room w tabeli wyników i latarka przy każdym odrodzeniu
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)

Wszystkie lekcje w sekcji Gra Roblox: Ucieczka z ciemności

Poćwicz samodzielnie: Edytor online Roblox