Une plateforme d’achat
Leçon 7 sur 18 du cours Jeu Roblox : Tycoon d’usine de Coddy.
L’argent est fait pour être dépensé. Chaque dalle bleue devant le tapis roulant permet d’acheter quelque chose ; la première permet d’acheter un deuxième distributeur. Une dalle connaît son prix grâce à un attribut, Price, défini lors de la construction du monde.
L’objet qu’elle permet d’acheter attend dans ServerStorage.TycoonItems, déjà au bon endroit. L’achat le déplace dans le dossier Built de l’usine, ce qui le place dans le monde, et déplace la dalle dans ServerStorage, où personne ne peut marcher dessus. Elle est déplacée, pas détruite : une leçon ultérieure fera réapparaître les dalles.
if cash.Value >= price then
cash.Value -= price
pad.Parent = ServerStorage
items.Dropper2.Parent = tycoon.Built
endChaque membre qui touche la dalle déclenche Touched, plusieurs fois au même instant. Après que le premier a effectué l’achat, la dalle ne se trouve plus dans tycoon.Buttons ; vérifier cela en premier empêche donc un double achat.
Défi
MoyenFais fonctionner le premier bouton :
- Récupère
ServerStorageet gardelocal items = ServerStorage.TycoonItemsprès du début. - Quand un joueur touche
tycoon.Buttons.Dropper2Pad: ne fais rien, sauf s’il est le propriétaire et que le bouton se trouve toujours danstycoon.Buttons. Si son Cash est supérieur ou égal à l’attributPricedu bouton, déduis le prix, déplace le bouton dans ServerStorage, déplaceitems.Dropper2danstycoon.Builtet démarre-le.
Appuie sur Play, gagne 30 Cash et achète-le, puis appuie sur Check.
Essayez vous-même
local Players = game:GetService("Players")
local CollectionService = game:GetService("CollectionService")
local Debris = game:GetService("Debris")
local Settings = require(game.ReplicatedStorage.Settings)
local tycoon = workspace.Tycoon
local owner = nil
print("Ore is worth " .. Settings.OreValue .. " Cash")
-- Chaque joueur reçoit des 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 des 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, quel que soit le nombre de fois où il est démarré
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 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)
-- 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)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.