Lluvia de meteoritos
Lección 11 de 18 del curso Juego de Roblox: Supervivencia ante desastres de Coddy.
El segundo desastre hace caer un meteorito en llamas cada medio segundo durante toda la ronda. Un bucle que espera retrasaría la cuenta regresiva de la ronda, así que se ejecuta en paralelo con ella mediante task.spawn:
task.spawn(function()
while map.Parent do
-- deja caer un meteorito
task.wait(0.5)
end
end)while map.Parent do se detiene por sí solo: cuando la ronda destruye el mapa, su Parent pasa a ser nil. Cada meteorito aterriza en un lugar aleatorio, a math.random(-15, 15) studs del centro de la isla, y Debris:AddItem(meteor, 4) lo elimina 4 segundos después para que no se acumulen.
Con dos desastres, la ronda debe elegir. Se puede buscar una función en una tabla usando su nombre como cadena, Disasters["Meteors"], para que la ronda pueda ejecutar el desastre que corresponda al nombre de Settings.Disaster. La configuración de esta lección especifica los meteoritos.
Desafío
IntermedioAñade la lluvia de meteoritos:
- Obtén el servicio
Debrisal principio. - Escribe
Disasters.Meteors(map): en untask.spawn, mientras el mapa esté en el juego, crea en el mapa una pieza esférica llamadaMeteor(de 3 por 3 por 3, naranja, Neon) en una posición X y Z aleatoria dentro de un radio de 15 studs demap.Base, a 40 studs de altura. Tocarla derrota al jugador; Debris la elimina después de 4 segundos; espera 0.5 segundos antes de crear la siguiente. - Reemplaza
Disasters.Flood(map)porDisasters[Settings.Disaster](map).
Presiona Play y esquiva los meteoritos; después, Check.
Pruébalo tú mismo
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")
-- Cada jugador recibe Wins en la tabla de clasificación
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)
-- El panel de estado en el vestíbulo
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
-- Los desastres, por nombre
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
-- El bucle de rondas
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
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Roblox: Supervivencia ante desastres
3Desastres
Inundación creciente