Menu
CoddyTech

Chaque plateforme

Leçon 9 sur 18 du cours Jeu Roblox : Tycoon d’usine de Coddy.

Quatre autres socles attendent, et copier quatre fois le code d’achat signifierait corriger chaque bogue quatre fois. Une seule fonction gère tous les socles : l’attribut Item de chaque socle indique ce qu’il achète, et items:FindFirstChild(name) trouve cet élément.

local function buy(pad, player)
	-- les vérifications et le prix, comme avant
	build(items:FindFirstChild(pad:GetAttribute("Item")))
end

Une deuxième fonction, build(item), place un élément dans l’usine et le démarre s’il s’agit d’un distributeur (il possède le tag Dropper). Les murs, la statue et l’améliorateur sont construits de la même façon ; seuls les distributeurs démarrent.

challenge icon

Défi

Moyen

Remplace le code du pad unique :

  1. Écris build(item) : déplace l’élément dans tycoon.Built, et démarre-le s’il possède le tag Dropper.
  2. Écris buy(pad, player) : effectue les mêmes vérifications et applique le même prix qu’avant, puis déplace le pad dans ServerStorage et construis l’élément indiqué par son attribut Item.
  3. Connecte Touched sur chaque pad dans tycoon.Buttons pour appeler buy pour le joueur qui le touche.

Appuie sur Jouer et achète les éléments le long de la rangée, puis clique sur Vérifier.

Essayez vous-même

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")

-- Chaque joueur reçoit du Cash dans le classement
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)

-- Le panneau au-dessus de l’usine
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 : une petite pièce qui vaut du Cash, lâchée sous un dropper
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 dropper n’exécute qu’une seule boucle, même s’il est démarré plusieurs fois
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

-- Le convoyeur transporte tout ce qui repose dessus
tycoon.Conveyor.AssemblyLinearVelocity = Vector3.new(Settings.BeltSpeed, 0, 0)

-- Le collecteur transforme le minerai 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)

-- La plateforme d’achat d’un deuxième dropper
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
end)

-- Une étiquette de prix flotte au-dessus de chaque plateforme
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

-- Attribution : le premier joueur à marcher sur la plateforme devient propriétaire de l’usine
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 iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Jeu Roblox : Tycoon d’usine