Bậc thang biến mất
Bài học 7 trên 21 trong khóa học Trò chơi Roblox: Tháp bất tận của Coddy.
Các bậc kính gắn thẻ Vanish sẽ mờ dần ngay sau khi bạn đặt chân lên, rồi xuất hiện trở lại. Bạn có thể đi xuyên qua một bộ phận khi tắt CanCollide, còn giá trị Transparency cao sẽ khiến nó trông như biến mất:
part.Transparency = 0.8
part.CanCollide = falseSự kiện Touched kích hoạt với mỗi chi mà bạn chạm vào bậc, rồi kích hoạt lần nữa khi bạn rơi xuyên qua bậc đó. Nếu không kiểm tra, mỗi lần chạm sẽ bắt đầu một hiệu ứng mờ riêng, khiến bậc nhấp nháy rất lâu sau khi bạn đã đi qua. Cơ chế debounce chỉ cho lần chạm đầu tiên đi qua: đánh dấu bậc khi nó đang bận và bỏ qua các lần chạm khi vẫn còn dấu đánh dấu.
if part:GetAttribute("Gone") then
return
end
part:SetAttribute("Gone", true)
-- Mờ dần, đợi, rồi xuất hiện trở lại
part:SetAttribute("Gone", nil)Thời gian chờ diễn ra bên trong hàm Touched. Roblox tự chạy hàm này, nên nó không bao giờ làm chậm phần còn lại của trò chơi.
Thử thách
Trung bìnhKhiến các bậc kính biến mất dưới chân bạn.
- Viết
makeVanish(part): khi có sự kiện Touched, nếu một nhân vật chạm vào và thuộc tínhGonechưa được đặt, hãy đặt nó thành true. - Chờ
Settings.VanishDelay, đặt Transparency thành0.8và CanCollide thành false; chờSettings.VanishTime, hoàn tác cả hai thay đổi rồi đặtGonethành nil. - Trong
setupStage, gọi hàm này cho các phần được gắn thẻVanish.
Nhấn Chơi rồi dừng trên một bậc kính: bậc kính mờ dần rồi xuất hiện trở lại. Sau đó nhấn Kiểm tra.
Tự làm thử
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local RunService = game:GetService("RunService")
local Settings = require(game.ReplicatedStorage.Settings)
local stages = ServerStorage.Stages
local tower = nil
print("Each tower has " .. Settings.StageCount .. " stages")
-- Mỗi người chơi đều có Wins 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
end)
-- Chạm vào bất kỳ thứ gì gắn thẻ Kill sẽ mất một mạng
local function killOnTouch(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- Đặt bài học 7: Vanishing Steps ở đây
-- Spinners xoay một chút ở mỗi khung hình
RunService.Heartbeat:Connect(function(dt)
for _, spinner in CollectionService:GetTagged("Spinner") do
if spinner:IsDescendantOf(workspace) then
spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
end
end
end)
-- Kích hoạt mọi chướng ngại vật trong một tầng dựa trên thẻ của chúng
local function setupStage(stage)
for _, part in stage:GetDescendants() do
if part:HasTag("Kill") then
part.Touched:Connect(killOnTouch)
end
end
end
-- Chọn ngẫu nhiên một tầng bất kỳ
local function pickStage()
local all = stages:GetChildren()
return all[math.random(1, #all)]
end
-- Đặt bản sao của một mô hình lên đỉnh tháp; trả về bản sao và độ cao mới của đỉnh tháp
local function stack(template, bottom)
local copy = template:Clone()
local box, size = copy:GetBoundingBox()
local lift = bottom - (box.Position.Y - size.Y / 2)
copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
copy.Parent = tower
return copy, bottom + size.Y
end
-- Tạo một tháp ngẫu nhiên mới từ dưới lên
local function buildTower()
tower = Instance.new("Model")
tower.Name = "Tower"
tower.Parent = workspace
local top = 0
for i = 1, Settings.StageCount do
local stage, newTop = stack(pickStage(), top)
top = newTop
setupStage(stage)
end
stack(ServerStorage.Finish, top)
end
buildTower()
Tất cả bài học trong Trò chơi Roblox: Tháp bất tận
Tự luyện tập: Playground Roblox