Menu
CoddyTech

Le Tourniquet

Leçon 5 sur 18 du cours Jeu Roblox : tour sans fin de Coddy.

L’étape Spinner comporte un bras rouge qui balaie la passerelle. C’est un Model, avec le tag Spinner, dont le pivot se trouve au niveau de son moyeu. Faire tourner l’ensemble du Model légèrement à chaque image le fait tourner.

RunService.Heartbeat se déclenche une fois par image et transmet dt, le nombre de secondes écoulées depuis la dernière image (environ 1/60). Tourner de speed * dt à chaque image revient à tourner de speed chaque seconde, quelle que soit la vitesse d’exécution du jeu.

Un CFrame correspond à une position et une rotation. La multiplication par CFrame.Angles applique une rotation, et les angles sont en radians ; convertis donc les degrés avec math.rad :

spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(90) * dt, 0))

CollectionService:GetTagged("Spinner") répertorie tous les éléments portant ce tag, y compris les modèles dans ServerStorage. Fais donc tourner uniquement ceux qui se trouvent dans le workspace. Le bras porte le tag Kill, il met donc déjà fin à une vie. Dans cette leçon, chaque étape est un Spinner.

challenge icon

Défi

Moyen
  1. Vers le haut du script, récupère CollectionService et RunService avec game:GetService.
  2. Connecte RunService.Heartbeat. À chaque image, pour chaque Model étiqueté Spinner qui se trouve dans le workspace, fais-le pivoter de CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0).

Appuie sur Play et synchronise ta course pour passer devant le bras, ou saute par-dessus. Puis clique sur Check.

Essayez vous-même

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil

print("Each tower has " .. Settings.StageCount .. " stages")

-- Chaque joueur reçoit des Wins 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
end)

-- Tout élément portant le tag Kill met fin à une vie
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Active tous les obstacles d’une étape selon leurs tags
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
	end
end

-- Une étape choisie au hasard
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Place une copie d’un modèle au sommet de la tour ; renvoie la copie et la nouvelle hauteur du sommet
local function stack(template, bottom)
	local copy = template:Clone()
	local box, size = copy:GetBoundingBox()
	local lift = bottom - (box.Position.Y - size.Y / 2)
	copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
	copy.Parent = tower
	return copy, bottom + size.Y
end

-- Construit une nouvelle tour aléatoire de bas en haut
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
	end
	stack(ServerStorage.Finish, top)
end

buildTower()
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 : tour sans fin