Menu
CoddyTech

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.

challenge icon

Desafío

Intermedio

Añade la inundación:

  1. Obtén TweenService al principio.
  2. Escribe defeat(hit): si hit.Parent tiene un Humanoid, establece su Health en 0.
  3. Crea local Disasters = {} y function Disasters.Flood(map): una pieza llamada Water en el mapa, anclada, con CanCollide desactivado, azul y transparente (Transparency 0.3), 10 studs más ancha que map.Base en cada dirección, empezando 2 studs por debajo. Tocar el agua provoca la derrota. Anima su Position 8 studs hacia arriba durante Settings.RoundLength * 0.8 segundos, a un ritmo constante (Enum.EasingStyle.Linear), para que se detenga por debajo de la parte superior de las rocas.
  4. 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
quiz iconPonte a prueba

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