Menu
CoddyTech

Le Monstre arrive

Leçon 9 sur 25 du cours Jeu Roblox : Échappe-toi des ténèbres de Coddy.

Maintenant, le monstre. ServerStorage.Shadow est un modèle grand et sombre avec un Humanoid, il marche donc avec Humanoid:MoveTo, comme n’importe quel PNJ.

Lorsque la salle Settings.MonsterFrom (4) s’ouvre, il arrive derrière les joueurs : à l’entrée de la salle située deux salles avant la plus récente. Une boucle sur les salles trouve celle-ci grâce à son Number :

for _, room in rooms:GetChildren() do
	if room:GetAttribute("Number") == count - 2 then
		behind = room
	end
end

Le pivot du modèle est en son milieu, il se place donc à 3.1 studs au-dessus de l’entrée pour se tenir sur le sol. Il conserve la vitesse de Settings.MonsterSpeed dans la propriété WalkSpeed de son Humanoid.

challenge icon

Défi

Moyen

Le monstre arrive derrière vous.

  1. Ajoutez local monster = nil en haut.
  2. Au-dessus de addRoom, écrivez spawnMonster() : clonez ServerStorage.Shadow dans monster à l’emplacement Entrance.CFrame + Vector3.new(0, 3.1, 0) de la salle count - 2 ; définissez WalkSpeed sur Settings.MonsterSpeed ; définissez son parent sur workspace.
  3. Dans addRoom, appelez cette fonction lorsque count == Settings.MonsterFrom.

Appuyez sur « Jouer » et traversez la salle 3 : le Shadow se tient deux salles derrière vous. Ensuite, cliquez 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 pièce la plus récente
local count = 0 -- pièces créées jusqu’à présent

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

-- Faire pivoter une porte sur ses gonds pour l’ouvrir
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

-- Lesson 9: The Monster Comes se place ici

local addRoom -- défini plus bas : une porte ajoute une pièce, et une pièce possède une porte

-- Ce qui se passe lorsqu’un joueur ouvre une porte
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)

-- Quand un joueur entre dans une pièce : elle devient sa Room 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 pièce à 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 pièce 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
	-- conserver la pièce la plus récente et KeepRooms pièces 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
	return room
end

-- Pour chaque joueur : Room dans le classement et une lampe torche à 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