Menu
CoddyTech

Chìa khóa và ổ khóa

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

Một số căn phòng bị khóa (mẫu Locked): cửa của chúng có thuộc tính Locked, còn chìa khóa nằm ở đâu đó bên trong, tại một KeySpot. Chìa khóa là một Tool; nhấn vào lời nhắc của nó sẽ đưa chìa khóa vào Backpack của người chơi.

Cửa bị khóa chỉ mở cho người chơi mang theo chìa khóa, trên tay (trong nhân vật) hoặc trong Backpack. Cửa sẽ tiêu thụ chìa khóa:

local key = findTool(player, "Key")
if not key then
	return
end
key:Destroy()
door:SetAttribute("Locked", nil)
challenge icon

Thử thách

Trung bình

Khóa cửa cho đến khi bạn tìm thấy chìa khóa của chúng.

  1. findTool(player, name): công cụ trong Character của họ, nếu không thì trong Backpack.
  2. addRoom đặt một bản sao của ServerStorage.Key trong phòng có KeySpot: key.Handle.CFrame = keySpot.CFrame.
  3. Handle.Prompt của nó sẽ tắt và chuyển nó vào Backpack của người chơi.
  4. Trong setupDoor, cửa Locked cần chìa khóa: hủy chìa khóa, xóa Locked.

Nhấn Chơi và đến phòng 3: cửa phòng cần chìa khóa. 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òn ánh mặt trời, ánh sáng mờ khắp nơi và có 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 tạo 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 một 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)

-- Tạo phòng mới ở 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 8: Chìa khóa và ổ khóa sẽ được thêm vào đây
	-- giữ lại phòng mới nhất và KeepRooms phòng phía sau
	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

-- 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)
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

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