Menu
CoddyTech

Une fois par coup

Leçon 4 sur 20 du cours Jeu Roblox : Arènes de combat de Coddy.

Un coup a infligé 30 dégâts au mannequin. Sa racine, ses jambes et sa tête sont trois parties, toutes dans la boîte, et chacune a blessé le même Humanoid.

Une table règle le problème : mémorise chaque Humanoid touché par ce coup et ignore celui que tu as déjà vu. Les clés d'une table peuvent être des instances :

local hit = {}
if humanoid and not hit[humanoid] then
	hit[humanoid] = true
	-- inflige-lui des dégâts, une seule fois
end

La table est créée dans swing, donc chaque coup commence avec une table vide, et chacun des deux ennemis dans la boîte est touché une seule fois.

challenge icon

Défi

Facile

Dans swing, créez local hit = {} avant la boucle, et n'infligez des dégâts à un Humanoid que s'il ne figure pas encore dans hit, en l'y ajoutant lorsque vous le faites.

Appuyez sur Jouer, puis sur Vérifier.

Essayez vous-même

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

local lastSwing = {} -- player -> moment de son dernier coup d'épée

-- Les animations d'épée de Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

print("Swords deal " .. Settings.SwordDamage .. " damage")

-- Un coup d'épée : l'animation se joue, puis tous ceux qui se trouvent dans la boîte devant vous sont touchés
local function swing(player)
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if not root or character.Humanoid.Health <= 0 then
		return
	end
	local now = time()
	if lastSwing[player] and now - lastSwing[player] < Settings.SwingCooldown then
		return
	end
	lastSwing[player] = now
	character.Humanoid.Animator:LoadAnimation(slash):Play()
	-- la boîte devant vous, jamais votre propre corps
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
		local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
		if humanoid then
			humanoid:TakeDamage(Settings.SwordDamage)
		end
	end
end

-- Chaque joueur reçoit Kills dans le classement et une épée à chaque vie
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local kills = Instance.new("IntValue")
	kills.Name = "Kills"
	kills.Parent = leaderstats

	player.CharacterAdded:Connect(function()
		local sword = ServerStorage.Sword:Clone()
		sword.Parent = player.Backpack
		sword.Activated:Connect(function()
			swing(player)
		end)
	end)
end)
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 : Arènes de combat