Menu
CoddyTech

Laser Geser

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

Stage Lasers memiliki dua dinding merah, dengan tag Slider dan Kill, yang bergerak melintasi jalur lalu kembali. Masing-masing memiliki atribut, Slide, berupa Vector3 yang menunjukkan posisi tujuannya dari posisi awal.

Tween dapat berulang. TweenInfo.new menerima waktu, easing, arah, jumlah pengulangan (-1 berarti selamanya), dan apakah akan diputar mundur:

local info = TweenInfo.new(2.5, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, true)
TweenService:Create(part, info, { Position = part.Position + part:GetAttribute("Slide") }):Play()

Linear menjaga kecepatan tetap stabil, sehingga pemain dapat memperkirakan gerakannya. Easing default memperlambat gerakan di setiap ujung, sehingga terlihat mulus tetapi sulit menentukan waktunya.

challenge icon

Tantangan

Sedang
  1. Di dekat bagian atas, ambil TweenService.
  2. Tulis makeSlide(part): gerakkan Position pada part ke Position-nya ditambah atribut Slide, selama Settings.SlideTime detik, Linear, berulang selamanya dan berbalik arah.
  3. Di setupStage, panggil fungsi ini untuk setiap part yang diberi tag Slider.

Tekan Play dan hindari laser. Lalu tekan Check.

Coba sendiri

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

-- 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 satu nyawa
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Pijakan yang menghilang memudar tak lama setelah seseorang menginjaknya, lalu muncul kembali
local function makeVanish(part)
	part.Touched:Connect(function(hit)
		if part:GetAttribute("Gone") or not hit.Parent:FindFirstChild("Humanoid") then
			return
		end
		part:SetAttribute("Gone", true)
		task.wait(Settings.VanishDelay)
		part.Transparency = 0.8
		part.CanCollide = false
		task.wait(Settings.VanishTime)
		part.Transparency = 0
		part.CanCollide = true
		part:SetAttribute("Gone", nil)
	end)
end

-- Spinner berputar sedikit setiap frame
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)

-- Aktifkan setiap rintangan dalam sebuah tahap berdasarkan tag-nya
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
		if part:HasTag("Vanish") then
			makeVanish(part)
		end
		if part:HasTag("Conveyor") then
			part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeed
		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 puncak 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 acak baru 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