Menu
CoddyTech

Meteoritenschauer

Lektion 11 von 18 im Kurs Roblox-Spiel: Katastrophen überleben von Coddy.

Die zweite Katastrophe lässt während der gesamten Runde jede halbe Sekunde einen brennenden Meteoriten herabfallen. Eine wartende Schleife würde den Countdown der Runde aufhalten, daher läuft sie parallel dazu mit task.spawn:

task.spawn(function()
	while map.Parent do
		-- einen Meteor fallen lassen
		task.wait(0.5)
	end
end)

while map.Parent do stoppt von selbst: Wenn die Runde die Karte zerstört, wird ihr Parent nil. Jeder Meteorit landet an einer zufälligen Stelle, math.random(-15, 15) Studs vom Zentrum der Insel entfernt, und Debris:AddItem(meteor, 4) entfernt ihn 4 Sekunden später, damit sie sich nicht anhäufen.

Bei zwei Katastrophen muss die Runde eine auswählen. Eine Funktion in einer Tabelle lässt sich anhand ihres Namens als Zeichenfolge abrufen, Disasters["Meteors"], sodass die Runde die Katastrophe ausführen kann, deren Name in Settings.Disaster steht. In den Einstellungen dieser Lektion sind die Meteoriten festgelegt.

challenge icon

Aufgabe

Mittel

Füge den Meteoritenschauer hinzu:

  1. Rufe oben den Dienst Debris ab.
  2. Schreibe Disasters.Meteors(map): Erzeuge in einem task.spawn, solange sich die Karte im Spiel befindet, ein kugelförmiges Part namens Meteor (3 mal 3 mal 3, orange, Neon) an einer zufälligen X- und Z-Position innerhalb von 15 Studs von map.Base, 40 Studs weiter oben, in der Karte. Bei Berührung wird man besiegt; Debris entfernt es nach 4 Sekunden; warte 0.5 Sekunden bis zum nächsten.
  3. Ersetze Disasters.Flood(map) durch Disasters[Settings.Disaster](map).

Drücke Play und weiche aus, dann Check.

Probier es selbst

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)

local lobbySpawn = workspace.LobbySpawn

print("Rounds last " .. Settings.RoundLength .. " seconds")

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

-- Die Statustafel in der Lobby
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.StatusBoard

local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.fromScale(1, 1)
status.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
status.TextColor3 = Color3.fromRGB(255, 255, 255)
status.TextScaled = true
status.Text = "Welcome to Disaster Survival!"
status.Parent = gui

local function setStatus(text)
	status.Text = text
end

local function teleport(player, target)
	local character = player.Character
	if character then
		character:PivotTo(target.CFrame + Vector3.new(0, 4, 0))
	end
end

local function defeat(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Die Katastrophen, nach Namen
local Disasters = {}

function Disasters.Flood(map)
	local base = map.Base
	local water = Instance.new("Part")
	water.Name = "Water"
	water.Anchored = true
	water.CanCollide = false
	water.Transparency = 0.3
	water.Color = Color3.fromRGB(40, 120, 255)
	water.Size = Vector3.new(base.Size.X + 10, 1, base.Size.Z + 10)
	water.Position = base.Position - Vector3.new(0, 2, 0)
	water.Parent = map
	water.Touched:Connect(defeat)

	local rise = TweenInfo.new(Settings.RoundLength * 0.8, Enum.EasingStyle.Linear)
	TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()
end

-- Die Rundenschleife
while true do
	for seconds = Settings.Intermission, 1, -1 do
		setStatus("Intermission: " .. seconds)
		task.wait(1)
	end

	local map = ServerStorage.Maps.Island:Clone()
	map.Name = "Map"
	map.Parent = workspace

	local survivors = {}
	for _, player in Players:GetPlayers() do
		local character = player.Character
		if character and character.Humanoid.Health > 0 then
			teleport(player, map.Spawn)
			survivors[player] = true
			character.Humanoid.Died:Connect(function()
				survivors[player] = nil
			end)
		end
	end

	Disasters.Flood(map)
	for seconds = Settings.RoundLength, 1, -1 do
		setStatus("Time left: " .. seconds)
		task.wait(1)
	end

	local names = {}
	for player in survivors do
		player.leaderstats.Wins.Value += 1
		teleport(player, lobbySpawn)
		table.insert(names, player.Name)
	end
	map:Destroy()
	if #names > 0 then
		setStatus("Winners: " .. table.concat(names, ", "))
	else
		setStatus("Nobody survived!")
	end
	task.wait(3)
end
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: Katastrophen überleben