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
endLa 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.
Défi
FacileDans 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)
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.