Hoạt ảnh xây dựng
Bài học 12 trên 22 trong khóa học Game Roblox: nhà máy tycoon của Coddy.
Vật phẩm đã mua sẽ bật vào vị trí. Một trò chơi tycoon sẽ hấp dẫn hơn khi vật phẩm rise lên khỏi mặt đất và dần hiện ra. Tween sẽ làm việc đó: ghi nhớ vị trí của bộ phận và độ trong suốt cần có, di chuyển bộ phận xuống 8 studs rồi làm nó vô hình, sau đó tween bộ phận trở lại:
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()Vật phẩm có thể là một bộ phận (dropper) hoặc một Model gồm nhiều bộ phận (các bức tường), vì vậy build nâng chính vật phẩm lên nếu đó là một bộ phận, còn nếu không thì nâng từng bộ phận bên trong nó.
Dropper bắt đầu hoạt động khi vẫn còn dưới lòng đất sẽ thả quặng đầu tiên xuống khoảng không, vì vậy dropper đã mua chỉ bắt đầu sau khi hạ cánh: task.delay(1, startDropper, item) chạy nó sau một giây.
Thử thách
Trung bìnhKhiến các vật phẩm đã mua trồi lên khỏi mặt đất.
- Lấy
TweenServicevà viếtriseIn(part)như trong bài học. - Trong
build, sau khi chuyển vật phẩm vào nhà máy, hãy gọiriseIncho vật phẩm nếu đó là BasePart, và cho mọi BasePart trong số các phần tử con của nó. - Bắt đầu máy thả vật phẩm đã mua bằng
task.delay(1, startDropper, item).
Nhấn "Chơi" và mua các bức tường: chúng sẽ trồi lên và hiện dần. Sau đó nhấn "Kiểm tra".
Tự làm thử
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")
-- Mỗi người chơi có Cash trên bảng xếp hạng
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)
-- Biển hiệu phía trên nhà máy
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: một khối nhỏ có giá trị Cash, rơi xuống dưới máy thả
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
local function startDropper(dropper)
task.spawn(function()
while dropper:IsDescendantOf(workspace) do
dropOre(dropper)
task.wait(Settings.DropInterval)
end
end)
end
-- Băng chuyền vận chuyển mọi thứ nằm trên đó
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)
-- Bộ thu gom chuyển Ore thành 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)
-- Bộ nâng cấp nhân đôi giá trị của mỗi Ore đi qua, chỉ một lần
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)
-- Bài học 12: thêm hiệu ứng xây dựng vào đây
-- Đặt vật phẩm đã mua vào nhà máy
local function build(item)
item.Parent = tycoon.Built
if item:HasTag("Dropper") then
startDropper(item)
end
end
-- Mua hàng: bệ biến mất và vật phẩm tương ứng được xây dựng
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
-- Nhãn giá hiện phía trên mỗi bệ
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
-- Nhận nhà máy: người chơi đầu tiên bước lên bệ sẽ sở hữu nhà máy
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)
Tất cả bài học trong Game Roblox: nhà máy tycoon
Tự luyện tập: Playground Roblox