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.
Aufgabe
MittelFüge den Meteoritenschauer hinzu:
- Rufe oben den Dienst
Debrisab. - Schreibe
Disasters.Meteors(map): Erzeuge in einemtask.spawn, solange sich die Karte im Spiel befindet, ein kugelförmiges Part namensMeteor(3 mal 3 mal 3, orange, Neon) an einer zufälligen X- und Z-Position innerhalb von 15 Studs vonmap.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. - Ersetze
Disasters.Flood(map)durchDisasters[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
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
3Katastrophen
Steigende Flut