Le sol est de la lave
Leçon 18 sur 18 du cours Jeu Roblox : Survivre aux catastrophes de Coddy.
La dernière catastrophe est à toi de la terminer : le sol se transforme en lave. Petit avertissement : pendant 3 secondes, il passe de sa couleur initiale au rouge, puis devient mortel. Seul le Base de la carte se transforme : les rochers et les toits restent sûrs, alors les joueurs ont 3 secondes pour grimper.
TweenService:Create(base, TweenInfo.new(3), { Color = Color3.fromRGB(255, 60, 20) }):Play()
task.wait(3)
base.Material = Enum.Material.Neon
base.Touched:Connect(defeat)Deux détails sont importants. Les joueurs déjà debout sur l’île l’ont touchée bien avant, et Touched ne se déclenche qu’au début d’un contact, alors base:GetTouchingParts() repère qui se trouve dessus en ce moment. Et cette catastrophe attend, donc l’appeler de l’ancienne façon figerait le compte à rebours de la manche pendant 3 secondes : démarre chaque catastrophe avec task.spawn(Disasters[disaster], map) pour qu’elle s’exécute en parallèle du compte à rebours.
Voilà qui termine Disaster Survival. À toi de jouer : invente une catastrophe (une tornade de pièces qui tournent, de la glace qui tombe, un mur mobile), ajoute une carte qui suit le plan Base et Spawn, ajuste les paramètres, puis utilise Enregistrer en tant que projet pour partager un lien auquel tes amis pourront jouer.
Défi
DifficileAjoute la lave, puis personnalise le jeu :
- Écris
Disasters.Lava(map): anime la couleur demap.Basejusqu’àColor3.fromRGB(255, 60, 20)en 3 secondes, attends 3 secondes, applique le matériau Neon, connecte son événement Touched à defeat, et élimine chaque partie qui le touche à cet instant. - Lance le désastre de la manche avec
task.spawn(Disasters[disaster], map).
Les paramètres de cette leçon déclenchent la lave. Appuie sur Play, puis sur Check. Ajoute ensuite ton propre désastre et définis Settings.Disaster sur son nom pour l’essayer.
Essayez vous-même
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)
local lobbySpawn = workspace.LobbySpawn
local winsStore = DataStoreService:GetDataStore("Wins")
print("Rounds last " .. Settings.RoundLength .. " seconds")
-- Chaque joueur a Wins et Streak dans le classement
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Parent = leaderstats
local streak = Instance.new("IntValue")
streak.Name = "Streak"
streak.Parent = leaderstats
-- les Wins sauvegardés par ce joueur la dernière fois
local ok, saved = pcall(function()
return winsStore:GetAsync(player.UserId)
end)
if ok and saved then
wins.Value = saved
end
end)
local function saveWins(player)
pcall(function()
winsStore:SetAsync(player.UserId, player.leaderstats.Wins.Value)
end)
end
Players.PlayerRemoving:Connect(saveWins)
game:BindToClose(function()
for _, player in Players:GetPlayers() do
saveWins(player)
end
end)
-- Le panneau d’état dans le hall
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.StatusBoard
local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.fromScale(1, 1)
status.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
status.TextColor3 = Color3.fromRGB(255, 255, 255)
status.TextScaled = true
status.Text = "Welcome to Disaster Survival!"
status.Parent = gui
local function setStatus(text)
status.Text = text
end
local function teleport(player, target)
local character = player.Character
if character then
character:PivotTo(target.CFrame + Vector3.new(0, 4, 0))
end
end
local function defeat(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- Une étiquette flottante "Survivor" au-dessus de la tête d’un joueur
local function tagSurvivor(character)
local tag = Instance.new("BillboardGui")
tag.Name = "SurvivorTag"
tag.Size = UDim2.fromOffset(120, 30)
tag.StudsOffset = Vector3.new(0, 2.5, 0)
tag.Parent = character.Head
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.Text = "Survivor"
label.TextColor3 = Color3.fromRGB(80, 255, 120)
label.TextScaled = true
label.Parent = tag
end
-- Les catastrophes, par nom
local Disasters = {}
function Disasters.Flood(map)
local base = map.Base
local water = Instance.new("Part")
water.Name = "Water"
water.Anchored = true
water.CanCollide = false
water.Transparency = 0.3
water.Color = Color3.fromRGB(40, 120, 255)
water.Size = Vector3.new(base.Size.X + 10, 1, base.Size.Z + 10)
water.Position = base.Position - Vector3.new(0, 2, 0)
water.Parent = map
water.Touched:Connect(defeat)
local rise = TweenInfo.new(Settings.RoundLength * 0.8, Enum.EasingStyle.Linear)
TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()
end
function Disasters.Meteors(map)
local base = map.Base
task.spawn(function()
while map.Parent do
local meteor = Instance.new("Part")
meteor.Name = "Meteor"
meteor.Shape = Enum.PartType.Ball
meteor.Size = Vector3.new(3, 3, 3)
meteor.Color = Color3.fromRGB(255, 120, 30)
meteor.Material = Enum.Material.Neon
local x = base.Position.X + math.random(-15, 15)
local z = base.Position.Z + math.random(-15, 15)
meteor.Position = Vector3.new(x, 40, z)
meteor.Parent = map
meteor.Touched:Connect(defeat)
Debris:AddItem(meteor, 4)
task.wait(0.5)
end
end)
end
function Disasters.Shrink(map)
local base = map.Base
local shrink = TweenInfo.new(Settings.RoundLength * 0.7, Enum.EasingStyle.Linear)
TweenService:Create(base, shrink, { Size = Vector3.new(6, base.Size.Y, 6) }):Play()
end
local function pickDisaster()
if Settings.Disaster then
return Settings.Disaster
end
local names = {}
for name in Disasters do
table.insert(names, name)
end
table.sort(names)
return names[math.random(1, #names)]
end
local function pickMap()
local maps = ServerStorage.Maps
if Settings.Map then
return maps:FindFirstChild(Settings.Map)
end
local all = maps:GetChildren()
return all[math.random(1, #all)]
end
-- La boucle des manches
while true do
for seconds = Settings.Intermission, 1, -1 do
setStatus("Intermission: " .. seconds)
task.wait(1)
end
local template = pickMap()
local map = template:Clone()
map.Name = "Map"
map.Parent = workspace
setStatus("Map: " .. template.Name)
local survivors = {}
for _, player in Players:GetPlayers() do
local character = player.Character
if character and character.Humanoid.Health > 0 then
teleport(player, map.Spawn)
tagSurvivor(character)
survivors[player] = true
character.Humanoid.Died:Connect(function()
survivors[player] = nil
player.leaderstats.Streak.Value = 0
end)
end
end
task.wait(2)
local disaster = pickDisaster()
Disasters[disaster](map)
for seconds = Settings.RoundLength, 1, -1 do
setStatus(disaster .. "! Time left: " .. seconds)
task.wait(1)
end
local names = {}
for player in survivors do
player.leaderstats.Wins.Value += 1
player.leaderstats.Streak.Value += 1
local tag = player.Character and player.Character.Head:FindFirstChild("SurvivorTag")
if tag then
tag:Destroy()
end
teleport(player, lobbySpawn)
table.insert(names, player.Name)
end
map:Destroy()
if #names > 0 then
setStatus("Winners: " .. table.concat(names, ", "))
else
setStatus("Nobody survived!")
end
task.wait(3)
end
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.