Menu
CoddyTech

Steigende Lava

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

Unten zu warten, sollte nicht sicher sein. Eine Lavaschicht beginnt unter dem Turm und steigt nach einer kurzen Verzögerung stetig an, bis sie 2 Studs unter der Spitze ist, sodass alle weiterklettern müssen.

Eine Tween-Animation kann warten, bevor sie startet: Das sechste Argument von TweenInfo.new ist eine Verzögerung in Sekunden. Für einen gleichmäßigen Aufstieg ergibt sich die Dauer der Tween-Animation aus der Strecke geteilt durch die Geschwindigkeit:

local seconds = top / Settings.LavaSpeed
local info = TweenInfo.new(seconds, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)

Die Lava ist nicht fest (CanCollide false), sodass niemand darauf stehen kann, und ihr Ereignis Touched verwendet killOnTouch, dieselbe Funktion wie die Kill-Blöcke. Sie beginnt auf einer Höhe von -2 und steigt bis auf top - 2, genau top Studs.

challenge icon

Aufgabe

Mittel
  1. Nahe am Anfang: local lava = nil. Lass buildTower top zurückgeben.
  2. Schreibe startLava(top): Erstelle ein verankertes Part namens Lava, nicht CanCollide, mit den Maßen 30 × 2 × 30, bei Vector3.new(0, -2, 0), orangefarbenem Neon (Color3.fromRGB(255, 90, 20)), im Workspace, dessen Touched mit killOnTouch verbunden ist. Tween die Position über top / Settings.LavaSpeed Sekunden auf Vector3.new(0, top - 2, 0), linear und nach einer Verzögerung von Settings.LavaDelay.
  3. Am Ende: local top = buildTower() und dann startLava(top).

Die Lava in dieser Lektion ist schnell, damit die Überprüfung zügig geht. Drücke Play und dann 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 TweenService = game:GetService("TweenService")
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 verblasst kurz nachdem jemand darauf gelandet ist 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

-- Ein Laser gleitet zu seinem Slide-Versatz und wieder zurück, ohne Ende
local function makeSlide(part)
	local info = TweenInfo.new(Settings.SlideTime, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, true)
	local goal = { Position = part.Position + part:GetAttribute("Slide") }
	TweenService:Create(part, info, goal):Play()
end

-- Ein Sprungfeld schleudert jeden, der darauf landet, in die Luft
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
	end
end

-- Spinner drehen sich bei jedem Frame ein Stück
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
		if part:HasTag("Slider") then
			makeSlide(part)
		end
		if part:HasTag("Bounce") then
			part.Touched:Connect(bounce)
		end
	end
end

-- Eine beliebige Stage, zufällig ausgewählt
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 einen neuen zufälligen Turm von unten nach oben
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