Menu
CoddyTech

Gleitende Laser

Lektion 8 von 18 im Kurs Roblox-Spiel: Endloser Turm von Coddy.

Die Lasers-Stufe hat zwei rote Wände, die mit Slider und Kill gekennzeichnet sind und über den Weg und zurück gleiten. Jede hat ein Attribut, Slide, einen Vector3-Wert, der angibt, wohin sie sich von ihrer Startposition aus bewegt.

Eine Tween-Animation kann wiederholt werden. TweenInfo.new erhält die Dauer, die Easing-Funktion, eine Richtung, die Anzahl der Wiederholungen (-1 bedeutet unendlich) und ob die Animation rückwärts abgespielt werden soll:

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 sorgt für eine gleichmäßige Geschwindigkeit, sodass ein Spieler sie einschätzen kann. Die standardmäßige Easing-Funktion verlangsamt die Bewegung an jedem Ende. Das sieht flüssig aus, ist aber schwer zeitlich einzuschätzen.

challenge icon

Aufgabe

Mittel
  1. Rufe weit oben TweenService ab.
  2. Schreibe makeSlide(part): Tween die Position des Parts auf seine Position plus sein Slide-Attribut. Das dauert Settings.SlideTime Sekunden, mit Linear-Easing, und wiederholt sich endlos mit Richtungsumkehr.
  3. Rufe die Funktion in setupStage für jedes Teil auf, das mit Slider getaggt ist.

Drücke Play und weiche den Lasern aus. Klicke dann auf Check.

Probier es selbst

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

-- Jeder Spieler erhält Wins auf der Bestenliste
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)

-- Alles mit dem Tag Kill beendet ein Leben
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Eine verschwindende Stufe wird kurz nach dem Betreten unsichtbar und erscheint dann wieder
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

-- Spinners drehen sich in jedem Frame ein Stück weiter
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)

-- Aktiviere jedes Hindernis in einer stage anhand seiner Tags
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

-- Wähle zufällig eine stage aus
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Setze eine Kopie eines Modells oben auf den Turm; gibt die Kopie und die neue Oberkante zurück
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

-- Baue von unten nach oben einen neuen zufälligen Turm
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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Roblox-Spiel: Endloser Turm