Pioggia di meteoriti
Lezione 11 di 18 del corso Gioco Roblox: Sopravvivenza ai disastri di Coddy.
Il secondo disastro fa cadere una meteora infuocata ogni mezzo secondo per tutta la durata del round. Un ciclo che attende rallenterebbe il conto alla rovescia del round, quindi viene eseguito in parallelo con task.spawn:
task.spawn(function()
while map.Parent do
-- fai cadere un meteorite
task.wait(0.5)
end
end)while map.Parent do si interrompe da solo: quando il round distrugge la mappa, il suo Parent diventa nil. Ogni meteora atterra in un punto casuale, a math.random(-15, 15) studs dal centro dell'isola, e Debris:AddItem(meteor, 4) la rimuove 4 secondi dopo, così non si accumulano.
Con due disastri, il round deve scegliere. È possibile richiamare una funzione in una tabella usando il suo nome come stringa, Disasters["Meteors"], così il round può attivare il disastro indicato da Settings.Disaster. Le impostazioni di questa lezione indicano le meteore.
Sfida
MedioAggiungi la pioggia di meteoriti:
- Recupera il servizio
Debrisin cima. - Scrivi
Disasters.Meteors(map): in untask.spawn, mentre la mappa è nel gioco, crea nella mappa una parte sferica chiamataMeteor(3 per 3 per 3, arancione, Neon) con coordinate X e Z casuali entro 15 stud damap.Base, a 40 stud di altezza. Toccarla sconfigge il giocatore; Debris la rimuove dopo 4 secondi; attendi 0.5 secondi prima della successiva. - Sostituisci
Disasters.Flood(map)conDisasters[Settings.Disaster](map).
Premi Play e schiva, poi Check.
Provalo tu
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")
-- Ogni giocatore ottiene Wins nella classifica
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)
-- Il tabellone dello stato nella 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
-- I disastri, per nome
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
-- Il ciclo dei round
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
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Gioco Roblox: Sopravvivenza ai disastri
3Disastri
Inondazione crescente