Los montones vuelven
Lección 4 de 18 del curso Juego de Roblox: simulador de mascotas de Coddy.
Cuando se rompen todas las pilas, el juego se queda sin monedas. Una pila rota debería volver a aparecer en su lugar después de Settings.RespawnTime segundos.
La pila tiene que recordar su lugar. Una tabla cuya clave es la pila sirve para eso:
local pileSpot = {} -- cada pile -> el spot sobre el que se apoya
pileSpot[pile] = spottask.delay(seconds, fn, ...) llama a una función más tarde, con argumentos, sin detener nada ahora:
task.delay(Settings.RespawnTime, spawnPile, spot)Quita la pila de la tabla cuando se rompa, para que la tabla no conserve todas las pilas que hayan existido.
Desafío
Fácil- Cerca de la parte superior:
local pileSpot = {}. - En
spawnPile, guardapileSpot[pile] = spot. - En
hitPile, cuando se rompe la pila: lee su posición, elimínala depileSpot, destruye la pila ytask.delay(Settings.RespawnTime, spawnPile, spot).
Las pilas de esta lección vuelven después de 1 segundo. Pulsa Play y después Check.
Pruébalo tú mismo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local piles = workspace.Piles
print("A Meadow pile gives " .. Settings.PileValue .. " coins")
-- Cada jugador recibe Coins en la tabla de clasificación
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local coins = Instance.new("IntValue")
coins.Name = "Coins"
coins.Parent = leaderstats
end)
-- El clic en una pila necesita hitPile, que se define después de spawnPile: decláralo
-- aquí, antes de cualquiera de las dos funciones
local hitPile
-- Una pila de monedas en una posición: una copia de ServerStorage.CoinPile con su salud
-- y su valor como atributos
local function spawnPile(spot)
local pile = ServerStorage.CoinPile:Clone()
pile.Position = spot.Position
pile:SetAttribute("MaxHealth", Settings.PileHealth)
pile:SetAttribute("Health", Settings.PileHealth)
pile:SetAttribute("Value", Settings.PileValue)
-- haz clic en ella para golpearla
local detector = Instance.new("ClickDetector")
detector.Parent = pile
pile.Parent = piles
detector.MouseClick:Connect(function(player)
hitPile(player, pile)
end)
return pile
end
-- Un golpe reduce en 1 la salud de una pila;
-- al llegar a 0, la pila se rompe y entrega su valor
function hitPile(player, pile)
local health = pile:GetAttribute("Health") - 1
if health > 0 then
pile:SetAttribute("Health", health)
return
end
player.leaderstats.Coins.Value += pile:GetAttribute("Value")
pile:Destroy()
end
-- Una pila en cada posición de Meadow
for _, spot in workspace.Zones.Meadow.Spawns:GetChildren() do
spawnPile(spot)
end
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.