Crear una animación
Lección 11 de 18 del curso Juego de Roblox: Magnate de fábrica de Coddy.
Los artículos comprados aparecen en su lugar. Un tycoon se siente mejor cuando se eleva desde el suelo y aparece gradualmente. Una interpolación lo hace: recuerda dónde debe estar la pieza y cuán transparente debe ser, muévela 8 studs hacia abajo y hazla invisible, luego interpólala de vuelta:
local goal = part.Position
local transparency = part.Transparency
part.Position = goal - Vector3.new(0, 8, 0)
part.Transparency = 1
TweenService:Create(part, TweenInfo.new(1), { Position = goal, Transparency = transparency }):Play()Un artículo puede ser una pieza (un dropper) o un Model compuesto por piezas (las paredes), así que build eleva el artículo mismo si es una pieza, y cada pieza que contiene.
Un dropper que se inicia mientras todavía está bajo tierra deja caer su primer mineral en el vacío, así que un dropper comprado se inicia una vez que ha aterrizado: task.delay(1, startDropper, item) lo ejecuta un segundo después.
Desafío
IntermedioAnimar la construcción:
- Obtén
TweenServicey escriberiseIn(part)como en la lección. - En
build, después de mover el elemento a la fábrica: haz que el elemento se eleve si es un BasePart, y también cada BasePart entre sus descendientes. - Inicia un dispensador comprado con
task.delay(1, startDropper, item).
Pulsa Play y observa cómo se levantan las paredes, después pulsa Check.
Pruébalo tú mismo
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local CollectionService = game:GetService("CollectionService")
local Debris = game:GetService("Debris")
local Settings = require(game.ReplicatedStorage.Settings)
local tycoon = workspace.Tycoon
local items = ServerStorage.TycoonItems
local owner = nil
print("Ore is worth " .. Settings.OreValue .. " Cash")
-- Cada jugador recibe Cash en la tabla de clasificación
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local cash = Instance.new("IntValue")
cash.Name = "Cash"
cash.Parent = leaderstats
end)
-- El letrero sobre la fábrica
local gui = Instance.new("SurfaceGui")
gui.Parent = tycoon.Sign
local signLabel = Instance.new("TextLabel")
signLabel.Name = "Status"
signLabel.Size = UDim2.fromScale(1, 1)
signLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
signLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
signLabel.TextScaled = true
signLabel.Text = "Step on the green pad to claim this factory"
signLabel.Parent = gui
local function setSign(text)
signLabel.Text = text
end
-- Ore: una pieza pequeña que vale Cash y cae debajo de un dispensador
local function dropOre(dropper)
local ore = Instance.new("Part")
ore.Name = "Ore"
ore.Size = Vector3.new(1, 1, 1)
ore.Color = Color3.fromRGB(150, 150, 160)
ore.Position = dropper.Position - Vector3.new(0, 2.5, 0)
ore:SetAttribute("Value", Settings.OreValue)
if math.random() < Settings.GoldChance then
ore.Color = Color3.fromRGB(255, 200, 40)
ore.Material = Enum.Material.Neon
ore:SetAttribute("Value", Settings.OreValue * 5)
end
ore.Parent = workspace
Debris:AddItem(ore, 20)
end
-- Un dispensador ejecuta un solo bucle, sin importar cuántas veces se inicie
local function startDropper(dropper)
if dropper:GetAttribute("Running") then
return
end
dropper:SetAttribute("Running", true)
task.spawn(function()
while dropper:IsDescendantOf(workspace) do
dropOre(dropper)
task.wait(Settings.DropInterval)
end
dropper:SetAttribute("Running", nil)
end)
end
-- La cinta transportadora lleva todo lo que se posa sobre ella
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)
-- El recolector convierte Ore en Cash
tycoon.Collector.Touched:Connect(function(hit)
if hit.Name == "Ore" then
local value = hit:GetAttribute("Value")
hit:Destroy()
if owner then
owner.leaderstats.Cash.Value += value
end
end
end)
-- El mejorador duplica el valor de cada Ore que pasa por él, una sola vez
items.Upgrader.Touched:Connect(function(hit)
if hit.Name == "Ore" and not hit:GetAttribute("Upgraded") then
hit:SetAttribute("Upgraded", true)
hit:SetAttribute("Value", hit:GetAttribute("Value") * 2)
hit.Color = Color3.fromRGB(155, 89, 182)
end
end)
-- Coloca un objeto comprado en la fábrica
local function build(item)
item.Parent = tycoon.Built
if item:HasTag("Dropper") then
startDropper(item)
end
end
-- Compra: la plataforma desaparece y se construye su objeto
local function buy(pad, player)
if player ~= owner or pad.Parent ~= tycoon.Buttons then
return
end
local cash = player.leaderstats.Cash
local price = pad:GetAttribute("Price")
if cash.Value < price then
return
end
cash.Value -= price
pad.Parent = ServerStorage
build(items:FindFirstChild(pad:GetAttribute("Item")))
end
for _, pad in tycoon.Buttons:GetChildren() do
pad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
buy(pad, player)
end
end)
end
-- Una etiqueta con el precio flota sobre cada plataforma
for _, pad in tycoon.Buttons:GetChildren() do
local tag = Instance.new("BillboardGui")
tag.Name = "PriceTag"
tag.Size = UDim2.fromOffset(160, 40)
tag.StudsOffset = Vector3.new(0, 3, 0)
tag.Parent = pad
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
label.BackgroundTransparency = 0.2
label.TextColor3 = Color3.fromRGB(255, 255, 255)
label.TextScaled = true
label.Text = pad:GetAttribute("Label") .. ": $" .. pad:GetAttribute("Price")
label.Parent = tag
end
-- Reclamación: el primer jugador que pisa la plataforma se convierte en dueño de la fábrica
local claimPad = tycoon.ClaimPad
claimPad.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player and not owner then
owner = player
claimPad.Color = Color3.fromRGB(120, 120, 120)
claimPad.Material = Enum.Material.SmoothPlastic
setSign(player.Name .. "'s Factory")
for _, dropper in CollectionService:GetTagged("Dropper") do
if dropper:IsDescendantOf(workspace) then
startDropper(dropper)
end
end
end
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: Magnate de fábrica
4Conviértelo en un juego
Fábrica completada