Inundación creciente
Lección 10 de 18 del curso Juego de Roblox: Supervivencia ante desastres de Coddy.
Es hora del primer desastre. El juego tendrá varios, así que van en una tabla, cada uno como una función que recibe el mapa. Una función almacenada en una tabla se llama como cualquier otra:
local Disasters = {}
function Disasters.Flood(map)
-- crea el agua y eleva su nivel
end
Disasters.Flood(map)La inundación es una pieza azul y ancha que empieza debajo de la isla y sube, pero no hasta arriba: las rocas de Island y los tejados de Rooftops permanecen secos, así que un jugador que suba a tiempo sobrevive. Un desastre del que nadie pueda sobrevivir no es un juego. TweenService cambia una propiedad suavemente a lo largo del tiempo: indica cuánto debe durar con un TweenInfo, proporciona los valores objetivo y haz Play.
local rise = TweenInfo.new(12, Enum.EasingStyle.Linear)
TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()El agua no debe sostener a los jugadores, así que CanCollide es false y permanece Anchored. Derrotar a quien la toque es lo mismo que hacía la lava en el primer curso; en este juego se le da un nombre, defeat(hit), porque todos los desastres la usarán.
Asigna el agua como elemento secundario del mapa, para que al destruir el mapa al final de la ronda también desaparezca el agua.
Desafío
IntermedioAñade la inundación:
- Obtén
TweenServiceal principio. - Escribe
defeat(hit): sihit.Parenttiene un Humanoid, establece su Health en 0. - Crea
local Disasters = {}yfunction Disasters.Flood(map): una pieza llamadaWateren el mapa, anclada, con CanCollide desactivado, azul y transparente (Transparency 0.3), 10 studs más ancha quemap.Baseen cada dirección, empezando 2 studs por debajo. Tocar el agua provoca la derrota. Anima su Position 8 studs hacia arriba duranteSettings.RoundLength * 0.8segundos, a un ritmo constante (Enum.EasingStyle.Linear), para que se detenga por debajo de la parte superior de las rocas. - Llama a
Disasters.Flood(map)justo después de teletransportar a los jugadores.
Pulsa Play y corre para escapar de la marea: salta por las rocas a la izquierda del punto de aparición. Después, pulsa Check.
Pruébalo tú mismo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lobbySpawn = workspace.LobbySpawn
print("Rounds last " .. Settings.RoundLength .. " seconds")
-- Cada jugador obtiene 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
-- 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
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