Il marche
Leçon 10 sur 25 du cours Jeu Roblox : Échappe-toi des ténèbres de Coddy.
L’Ombre reste immobile. Son esprit fonctionne comme une boucle : toutes les quarts de seconde, elle marche vers le joueur vivant le plus proche. La boucle ne se termine jamais, alors elle s’exécute dans son propre thread avec task.spawn, et addRoom continue en même temps.
local function runMonster(shadow)
while shadow.Parent do
-- trouver quelqu’un, marcher vers cette personne
task.wait(0.25)
end
end
task.spawn(runMonster, monster)while shadow.Parent arrête la boucle une fois le monstre détruit.
Défi
MoyenFais marcher l’Ombre vers toi.
- Écris
nearestCharacter(position): le personnage du joueur vivant le plus proche, et la distance qui le sépare. - Écris
runMonster(shadow): tant queshadow.Parent, faisMoveTovers leHumanoidRootPart.Positiondu personnage le plus proche, puistask.wait(0.25). - À la fin de
spawnMonster, ajoutetask.spawn(runMonster, monster).
Appuie sur « Jouer » et traverse la salle 3 : l’Ombre fonce droit sur toi. Puis appuie sur « Vérifier ».
Essayez vous-même
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Lighting = game:GetService("Lighting")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)
local rooms = workspace.Rooms
local lastRoom = rooms.Lobby -- la salle la plus récente
local count = 0 -- salles créées jusqu’ici
local monster = nil
-- La nuit tombe : plus de soleil, un peu de lumière partout et du brouillard
Lighting.ClockTime = Settings.ClockTime
Lighting.Ambient = Settings.Ambient
Lighting.OutdoorAmbient = Settings.Ambient
Lighting.FogColor = Color3.new(0, 0, 0)
Lighting.FogEnd = Settings.FogEnd
print("Lights out")
-- Un outil qu’un joueur transporte : dans sa main ou dans son Backpack
local function findTool(player, name)
return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end
-- Ouvrir une porte en la faisant pivoter sur ses gonds
local function openDoor(door)
door:SetAttribute("Open", true)
door.Panel.Prompt.Enabled = false
local hinge, panel = door.Hinge, door.Panel
local goal = hinge.CFrame * CFrame.Angles(0, math.rad(90), 0) * hinge.CFrame:ToObjectSpace(panel.CFrame)
TweenService:Create(panel, TweenInfo.new(0.6), { CFrame = goal }):Play()
end
-- Leçon 10 : It Walks se place ici
-- Le monstre arrive derrière vous : à l’entrée de la salle située deux salles avant la plus récente
local function spawnMonster()
local behind = nil
for _, room in rooms:GetChildren() do
if room:GetAttribute("Number") == count - 2 then
behind = room
end
end
if not behind then
return
end
monster = ServerStorage.Shadow:Clone()
monster:PivotTo(behind.Entrance.CFrame + Vector3.new(0, 3.1, 0))
monster.Humanoid.WalkSpeed = Settings.MonsterSpeed
monster.Parent = workspace
end
local addRoom -- défini plus bas : une porte ajoute une salle, et une salle a une porte
-- Ce que fait une porte quand un joueur l’ouvre
local function setupDoor(door)
door.Panel.Prompt.Triggered:Connect(function(player)
if door:GetAttribute("Open") then
return
end
if door:GetAttribute("Locked") then
local key = findTool(player, "Key")
if not key then
return
end
key:Destroy()
door:SetAttribute("Locked", nil)
end
if door.Parent == lastRoom then
addRoom()
end
openDoor(door)
end)
end
setupDoor(workspace.Rooms.Lobby.Door)
-- Entrer dans une salle : elle devient la Room du joueur et son point de réapparition
local function setupEntry(room)
room.Entry.Touched:Connect(function(hit)
local player = Players:GetPlayerFromCharacter(hit.Parent)
if player then
local number = room:GetAttribute("Number")
player.leaderstats.Room.Value = number
player.RespawnLocation = room.Checkpoint
end
end)
end
setupEntry(workspace.Rooms.Lobby)
-- Une nouvelle salle à la sortie de la plus récente
function addRoom()
count += 1
local name = Settings.Order[(count - 1) % #Settings.Order + 1]
if count >= Settings.RoomsToEscape then
name = "Exit"
end
local room = ServerStorage.Rooms[name]:Clone()
room:PivotTo(lastRoom.Exit.CFrame)
room:SetAttribute("Number", count)
room.Sign.SurfaceGui.Number.Text = "Room " .. count
room.Parent = rooms
lastRoom = room
setupDoor(room.Door)
setupEntry(room)
-- une salle verrouillée garde sa clé à l’intérieur
local keySpot = room:FindFirstChild("KeySpot")
if keySpot then
local key = ServerStorage.Key:Clone()
key.Handle.CFrame = keySpot.CFrame
key.Parent = room
key.Handle.Prompt.Triggered:Connect(function(player)
key.Handle.Prompt.Enabled = false
key.Parent = player.Backpack
end)
end
-- garder la salle la plus récente et KeepRooms salles derrière elle
for _, old in rooms:GetChildren() do
local number = old:GetAttribute("Number")
if number < count - Settings.KeepRooms then
print("Room " .. number .. " is gone")
old:Destroy()
end
end
if count == Settings.MonsterFrom then
spawnMonster()
end
return room
end
-- Chaque joueur : Room dans le classement et une lampe de poche à chaque nouvelle vie
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local room = Instance.new("IntValue")
room.Name = "Room"
room.Parent = leaderstats
player.CharacterAdded:Connect(function()
local flashlight = ServerStorage.Flashlight:Clone()
flashlight.Parent = player.Backpack
local beam = flashlight.Handle.Beam
flashlight.Activated:Connect(function()
beam.Enabled = not beam.Enabled
end)
end)
end)
Toutes les leçons de Jeu Roblox : Échappe-toi des ténèbres
Entraînez-vous par vous-même : Playground Roblox