Menu
CoddyTech

Mọi bệ

Bài học 10 trên 22 trong khóa học Game Roblox: nhà máy tycoon của Coddy.

Còn bốn bệ nữa đang chờ, và sao chép code mua đồ bốn lần đồng nghĩa với việc phải sửa từng bug bốn lần. Một hàm xử lý mọi bệ: thuộc tính Item của mỗi bệ cho biết món đồ mà bệ đó mua, còn items:FindFirstChild(name) tìm món đồ đó.

local function buy(pad, player)
	-- các bước kiểm tra và giá, như trước
	build(items:FindFirstChild(pad:GetAttribute("Item")))
end

Hàm thứ hai, build(item), đặt một món đồ vào nhà máy và khởi động món đồ đó nếu nó là một máy thả đồ (có thẻ Dropper). Tường, tượng và máy nâng cấp đều được dựng theo cùng một cách; chỉ máy thả đồ mới khởi động.

challenge icon

Thử thách

Trung bình

Cho mọi pad hoạt động thông qua một hàm.

  1. Viết build(item): chuyển vật phẩm vào tycoon.Built và khởi động vật phẩm nếu item:HasTag("Dropper").
  2. Viết buy(pad, player): thực hiện các bước kiểm tra và kiểm tra giá như trước, sau đó chuyển pad vào ServerStorage và xây dựng vật phẩm có tên trong thuộc tính Item của pad.
  3. Thay vì dùng code Dropper2Pad, hãy kết nối sự kiện Touched của mọi pad trong tycoon.Buttons với buy.

Nhấn Chơi: mỗi pad bạn có đủ tiền mua sẽ xây dựng vật phẩm tương ứng. 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 vật thể nhỏ có giá trị Cash, rơi ra bên 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ứ đặt trên đó
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)

-- Bộ thu gom chuyển quặng 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ệ mua máy thả thứ hai
local pad = tycoon.Buttons.Dropper2Pad
pad.Touched:Connect(function(hit)
	local player = Players:GetPlayerFromCharacter(hit.Parent)
	if not player or 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
		cash.Value -= price
		pad.Parent = ServerStorage
		local dropper = items.Dropper2
		dropper.Parent = tycoon.Built
		startDropper(dropper)
	end
	-- Bài học 10: Mọi Pad đều đặt ở đây
end)

-- Nhãn giá lơ lửng 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 quyền sở hữu: 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)
quiz iconTự kiểm tra

Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.

Tất cả bài học trong Game Roblox: nhà máy tycoon

Tự luyện tập: Playground Roblox