Menu
CoddyTech

Pemutar

Pelajaran 5 dari 18 dalam kursus Game Roblox: Menara Tanpa Akhir di Coddy.

Stage Spinner memiliki lengan merah yang menyapu jalan setapak. Ini adalah Model dengan tag Spinner, yang pivot-nya berada di hub. Memutar seluruh Model sedikit setiap frame akan membuatnya berputar.

RunService.Heartbeat terpicu sekali setiap frame dan meneruskan dt, yaitu waktu dalam detik sejak frame terakhir (sekitar 1/60). Memutar sebesar speed * dt setiap frame akan menghasilkan putaran sebesar speed setiap detik, seberapa cepat pun game berjalan.

CFrame adalah posisi ditambah rotasi. Mengalikannya dengan CFrame.Angles akan memutarnya, dan sudutnya menggunakan radian, jadi konversikan derajat dengan math.rad:

spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(90) * dt, 0))

CollectionService:GetTagged("Spinner") mencantumkan semua yang memiliki tag tersebut, termasuk template di ServerStorage, jadi putar hanya yang ada di workspace. Lengan tersebut memiliki tag Kill, jadi lengan itu sudah mengakhiri nyawa. Dalam pelajaran ini, setiap stage adalah Spinner.

challenge icon

Tantangan

Sedang
  1. Di dekat bagian atas, dapatkan CollectionService dan RunService dengan game:GetService.
  2. Hubungkan RunService.Heartbeat. Pada setiap frame, untuk setiap Model yang diberi tag Spinner dan berada di workspace, putar pivot-nya sebesar CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0).

Tekan Play dan atur waktu larimu melewati lengan itu, atau lompati. Lalu tekan Check.

Coba sendiri

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")

-- Setiap pemain mendapat Wins di papan peringkat
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)

-- Apa pun yang diberi tag Kill mengakhiri nyawa
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Aktifkan setiap rintangan dalam satu tahap berdasarkan tag-nya
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
	end
end

-- Pilih tahap secara acak
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Letakkan salinan model di atas menara; kembalikan salinan dan posisi puncak yang baru
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

-- Bangun menara baru secara acak dari bawah ke atas
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()
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Roblox: Menara Tanpa Akhir

Latihan sendiri: Playground Roblox