Con quay
Bài học 6 trên 21 trong khóa học Trò chơi Roblox: Tháp bất tận của Coddy.
Giai đoạn Spinner có một cánh tay màu đỏ quét ngang lối đi. Đây là một Model được gắn thẻ Spinner, với trục xoay nằm ở phần trung tâm. Xoay toàn bộ Model một chút sau mỗi khung hình sẽ khiến nó quay.
RunService.Heartbeat kích hoạt một lần sau mỗi khung hình và truyền dt, số giây kể từ khung hình trước đó (khoảng 1/60). Xoay một góc speed * dt sau mỗi khung hình sẽ cộng dồn thành speed mỗi giây, bất kể trò chơi chạy nhanh đến đâu.
CFrame là vị trí cộng với góc xoay. Nhân với CFrame.Angles sẽ xoay nó, và các góc được tính bằng radian, vì vậy hãy chuyển đổi độ bằng math.rad:
spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(90) * dt, 0))CollectionService:GetTagged("Spinner") liệt kê mọi thứ mang thẻ này, bao gồm cả các mẫu trong ServerStorage, vì vậy chỉ xoay những đối tượng nằm trong workspace. Cánh tay được gắn thẻ Kill, nên nó đã khiến nhân vật mất mạng. Trong bài học này, mọi giai đoạn đều là Spinner.
Thử thách
Trung bìnhLàm cho cánh tay quay quét qua.
- Ở gần đầu đoạn code, lấy
CollectionServicevàRunServicebằnggame:GetService. - Kết nối
RunService.Heartbeat. Ở mỗi khung hình, với mọi Model được gắn thẻSpinnermàspinner:IsDescendantOf(workspace), xoay nó bằngCFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0).
Nhấn Chơi: cánh tay màu đỏ quét một góc phần tư mỗi giây. Sau đó, nhấn Kiểm tra.
Tự làm thử
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
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 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 cứ thứ gì có 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
-- Bài học 6: Đặt The Spinner ở đây
-- 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 đỉnh mới
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