Sàn nhà là dung nham
Bài học 20 trên 20 trong khóa học Trò chơi Roblox: sinh tồn trước thảm họa của Coddy.
Thảm họa cuối cùng đang chờ bạn hoàn thành: sàn biến thành dung nham. Lưu ý trước: sàn phát sáng trong 3 giây, chuyển từ màu ban đầu sang màu đỏ, rồi trở nên chết chóc. Chỉ Base trên bản đồ biến đổi: đá và mái nhà vẫn an toàn, nên người chơi có 3 giây để trèo lên.
TweenService:Create(base, TweenInfo.new(3), { Color = Color3.fromRGB(255, 60, 20) }):Play()
task.wait(3)
base.Material = Enum.Material.Neon
base.Touched:Connect(defeat)Có hai chi tiết quan trọng. Người chơi đang đứng trên đảo đã chạm vào đó từ lâu, mà Touched chỉ kích hoạt khi một lần chạm bắt đầu, nên base:GetTouchingParts() sẽ tìm ra những ai đang đứng trên đó lúc này. Thảm họa này có thời gian chờ, nên nếu gọi theo cách cũ, bộ đếm ngược của vòng chơi sẽ dừng trong 3 giây: hãy khởi chạy mọi thảm họa bằng task.spawn(Disasters[disaster], map) để chúng chạy song song với bộ đếm ngược.
Vậy là bạn đã hoàn thành Disaster Survival. Giờ đến lượt bạn tạo trò chơi: nghĩ ra một thảm họa (lốc xoáy gồm các phần xoay tròn, băng rơi, bức tường di chuyển), thêm bản đồ theo kế hoạch Base và Spawn, điều chỉnh cài đặt, rồi dùng Lưu thành dự án để chia sẻ liên kết cho bạn bè chơi.
Thử thách
KhóThêm thảm họa cuối cùng: sàn biến thành dung nham.
- Viết
Disasters.Lava(map): dùng tween để đổi Color củamap.BasethànhColor3.fromRGB(255, 60, 20)trong 3 giây, gọitask.wait(3), đổi chất liệu thành Neon và kết nối Touched của nó vớidefeat. - Sau đó gọi
defeatcho mọi bộ phận trongbase:GetTouchingParts(). - Bắt đầu thảm họa của vòng chơi bằng
task.spawn(Disasters[disaster], map).
Nhấn Chơi cho đến khi có vòng chơi Lava: hòn đảo phát sáng đỏ, rồi hạ gục bất cứ ai vẫn còn ở trên đó. Sau đó nhấn Kiểm tra.
Tự làm thử
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)
local lobbySpawn = workspace.LobbySpawn
local winsStore = DataStoreService:GetDataStore("Wins")
print("Rounds last " .. Settings.RoundLength .. " seconds")
-- Mỗi người chơi có Wins và Streak trên bảng xếp hạng
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Parent = leaderstats
local streak = Instance.new("IntValue")
streak.Name = "Streak"
streak.Parent = leaderstats
-- Giá trị Wins mà người chơi này đã lưu lần trước
local ok, saved = pcall(function()
return winsStore:GetAsync(player.UserId)
end)
if ok and saved then
wins.Value = saved
end
end)
local function saveWins(player)
pcall(function()
winsStore:SetAsync(player.UserId, player.leaderstats.Wins.Value)
end)
end
Players.PlayerRemoving:Connect(saveWins)
game:BindToClose(function()
for _, player in Players:GetPlayers() do
saveWins(player)
end
end)
-- Bảng trạng thái trong sảnh chờ
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.StatusBoard
local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.fromScale(1, 1)
status.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
status.TextColor3 = Color3.fromRGB(255, 255, 255)
status.TextScaled = true
status.Text = "Welcome to Disaster Survival!"
status.Parent = gui
local function setStatus(text)
status.Text = text
end
local function teleport(player, target)
local character = player.Character
if character then
character:PivotTo(target.CFrame + Vector3.new(0, 4, 0))
end
end
local function defeat(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- Nhãn "Survivor" nổi trên đầu người chơi
local function tagSurvivor(character)
local tag = Instance.new("BillboardGui")
tag.Name = "SurvivorTag"
tag.Size = UDim2.fromOffset(120, 30)
tag.StudsOffset = Vector3.new(0, 2.5, 0)
tag.Parent = character.Head
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.Text = "Survivor"
label.TextColor3 = Color3.fromRGB(80, 255, 120)
label.TextScaled = true
label.Parent = tag
end
-- Các thảm họa theo tên
local Disasters = {}
function Disasters.Flood(map)
local base = map.Base
local water = Instance.new("Part")
water.Name = "Water"
water.Anchored = true
water.CanCollide = false
water.Transparency = 0.3
water.Color = Color3.fromRGB(40, 120, 255)
water.Size = Vector3.new(base.Size.X + 10, 1, base.Size.Z + 10)
water.Position = base.Position - Vector3.new(0, 2, 0)
water.Parent = map
water.Touched:Connect(defeat)
local rise = TweenInfo.new(Settings.RoundLength * 0.8, Enum.EasingStyle.Linear)
TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()
end
function Disasters.Meteors(map)
local base = map.Base
task.spawn(function()
while map.Parent do
local meteor = Instance.new("Part")
meteor.Name = "Meteor"
meteor.Shape = Enum.PartType.Ball
meteor.Size = Vector3.new(3, 3, 3)
meteor.Color = Color3.fromRGB(255, 120, 30)
meteor.Material = Enum.Material.Neon
local x = base.Position.X + math.random(-15, 15)
local z = base.Position.Z + math.random(-15, 15)
meteor.Position = Vector3.new(x, 40, z)
meteor.Parent = map
meteor.Touched:Connect(defeat)
Debris:AddItem(meteor, 4)
task.wait(0.5)
end
end)
end
function Disasters.Shrink(map)
local base = map.Base
local shrink = TweenInfo.new(Settings.RoundLength * 0.7, Enum.EasingStyle.Linear)
TweenService:Create(base, shrink, { Size = Vector3.new(6, base.Size.Y, 6) }):Play()
end
-- Bài học 20: Sàn nhà là dung nham nằm ở đây
local function pickDisaster()
-- Settings.Disaster kích hoạt một thảm họa nếu trò chơi có thảm họa đó
if Settings.Disaster and Disasters[Settings.Disaster] then
return Settings.Disaster
end
local names = {}
for name in Disasters do
table.insert(names, name)
end
table.sort(names)
return names[math.random(1, #names)]
end
local function pickMap()
local maps = ServerStorage.Maps
if Settings.Map then
return maps:FindFirstChild(Settings.Map)
end
local all = maps:GetChildren()
return all[math.random(1, #all)]
end
-- Vòng lặp (loop) của các vòng chơi
while true do
for seconds = Settings.Intermission, 1, -1 do
setStatus("Intermission: " .. seconds)
task.wait(1)
end
local template = pickMap()
local map = template:Clone()
map.Name = "Map"
map.Parent = workspace
setStatus("Map: " .. template.Name)
local survivors = {}
for _, player in Players:GetPlayers() do
local character = player.Character
if character and character.Humanoid.Health > 0 then
teleport(player, map.Spawn)
tagSurvivor(character)
survivors[player] = true
character.Humanoid.Died:Connect(function()
survivors[player] = nil
player.leaderstats.Streak.Value = 0
end)
end
end
task.wait(2)
local disaster = pickDisaster()
Disasters[disaster](map)
for seconds = Settings.RoundLength, 1, -1 do
setStatus(disaster .. "! Time left: " .. seconds)
task.wait(1)
end
local names = {}
for player in survivors do
player.leaderstats.Wins.Value += 1
player.leaderstats.Streak.Value += 1
local tag = player.Character and player.Character.Head:FindFirstChild("SurvivorTag")
if tag then
tag:Destroy()
end
teleport(player, lobbySpawn)
table.insert(names, player.Name)
end
map:Destroy()
if #names > 0 then
setStatus("Winners: " .. table.concat(names, ", "))
else
setStatus("Nobody survived!")
end
task.wait(3)
end
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: sinh tồn trước thảm họa
4Biến mọi thứ thành trò chơi
Hai bản đồ2Bản đồ và người chơi
Tải bản đồTự luyện tập: Playground Roblox