Menu
CoddyTech

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.

challenge icon

Thử thách

Trung bình

Làm cho cánh tay quay quét qua.

  1. Ở gần đầu đoạn code, lấy CollectionService và RunService bằng game:GetService.
  2. Kết nối RunService.Heartbeat. Ở mỗi khung hình, với mọi Model được gắn thẻ Spinner mà spinner:IsDescendantOf(workspace), xoay nó bằng CFrame.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