Menu
CoddyTech

Dönen Engel

Coddy'nin Roblox Oyunu: Sonsuz Kule kursunda ders 5 / 18.

Spinner aşamasında yürüyüş yolunun üzerinden geçen kırmızı bir kol bulunur. Bu, pivotu göbeği olan ve Spinner etiketi taşıyan bir Model'dir. Her karede tüm Model'i biraz döndürmek, dönmesini sağlar.

RunService.Heartbeat her karede bir kez tetiklenir ve son kareden bu yana geçen saniye sayısını (yaklaşık 1/60) ifade eden dt değerini iletir. Her karede speed * dt kadar döndürmek, oyun ne hızda çalışırsa çalışsın, her saniye toplamda speed kadar dönüş sağlar.

CFrame, bir konum ile bir dönüşün birleşimidir. CFrame.Angles ile çarpmak onu döndürür ve açılar radyan cinsinden olduğundan, dereceleri math.rad ile dönüştür:

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

CollectionService:GetTagged("Spinner"), ServerStorage'daki şablonlar da dahil olmak üzere bu etiketi taşıyan her şeyi listeler; bu nedenle yalnızca workspace içindekileri döndür. Kol, Kill etiketi taşıdığından bir canı zaten bitirir. Bu derste her aşama bir Spinner'dır.

challenge icon

Görev

Orta
  1. Üst kısma yakın bir yerde, game:GetService ile CollectionService ve RunService servislerini al.
  2. RunService.Heartbeat olayına bağlan. Her karede, çalışma alanında bulunan Spinner etiketiyle işaretlenmiş her Model'i CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0) ile döndür.

Play'e bas ve kolun yanından geçmek için zamanlamanı ayarla ya da üzerinden zıpla. Ardından Check'e bas.

Kendin dene

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

-- Her oyuncunun liderlik tablosunda Wins değeri olur
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)

-- Kill etiketi taşıyan her şey bir canı sona erdirir
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Bir aşamadaki tüm engelleri etiketlerine göre etkinleştir
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
	end
end

-- Rastgele bir aşama
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Bir modelin kopyasını kulenin tepesine yerleştir; kopyayı ve yeni tepe yüksekliğini döndürür
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

-- Aşağıdan yukarıya yeni bir rastgele kule oluştur
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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Roblox Oyunu: Sonsuz Kule bölümündeki tüm dersler