Menu
CoddyTech

Dọn dẹp

Bài học 7 trên 25 trong khóa học Trò chơi Roblox: thoát khỏi bóng tối của Coddy.

Mỗi cánh cửa tạo thêm một căn phòng, và không căn phòng nào biến mất: chạy lâu sẽ khiến trò chơi có đầy những căn phòng mà người chơi sẽ không bao giờ thấy lại. Giữ căn phòng mới nhất cùng với Settings.KeepRooms căn phòng phía sau nó, rồi hủy phần còn lại:

for _, old in rooms:GetChildren() do
	local number = old:GetAttribute("Number")
	if number < count - Settings.KeepRooms then
		old:Destroy()
	end
end

Sảnh là phòng 0, nên sảnh cũng sẽ biến mất khi người chơi đi đủ xa, vượt qua màn sương. Một dòng in ra trong Output hiển thị từng căn phòng khi nó xuất hiện.

challenge icon

Thử thách

Trung bình

Xóa những căn phòng mà sẽ không ai nhìn thấy nữa.

  1. Ở cuối addRoom, trước khi hàm trả về, hãy lặp qua rooms:GetChildren().
  2. Với mỗi căn phòng có Number nhỏ hơn count - Settings.KeepRooms: in ra "Room " .. number .. " is gone", rồi hủy căn phòng đó.

Nhấn Chơi và mở bốn cánh cửa: Output hiển thị Room 0 is gone. Sau đó nhấn Kiểm tra.

Tự làm thử

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 -- phòng mới nhất
local count = 0 -- số phòng đã tạo đến lúc này

-- Đêm xuống: không có ánh mặt trời, ánh sáng mờ khắp nơi và sương mù
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")

-- Mở cửa bằng cách xoay quanh bản lề
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 -- viết ở bên dưới: một cánh cửa thêm một phòng, và mỗi phòng có một cánh cửa

-- Điều xảy ra khi người chơi mở cửa
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)

-- Khi người chơi bước vào phòng: phòng đó trở thành Room và điểm hồi sinh của họ
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)

-- Phòng mới nằm ở lối ra của phòng mới nhất
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)
	-- Bài học 7: thêm phần dọn dẹp vào đây
	return room
end

-- Mỗi người chơi: Room trên bảng xếp hạng và một chiếc đèn pin mỗi lần hồi sinh
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)

Tất cả bài học trong Trò chơi Roblox: thoát khỏi bóng tối

Tự luyện tập: Playground Roblox