Einmal pro Schwung
Lektion 4 von 20 im Kurs Roblox-Spiel: Schlachtfelder von Coddy.
Ein Schwung zog der Trainingspuppe 30 ab. Ihre Wurzel, Beine und ihr Kopf sind drei Teile, alle befinden sich in der Box, und jedes davon verletzte denselben Humanoid.
Eine Tabelle behebt das Problem: Merke dir jeden Humanoid, den dieser Schwung getroffen hat, und überspringe diejenigen, die du bereits gesehen hast. Tabellen können Instanzen als Schlüssel verwenden:
local hit = {}
if humanoid and not hit[humanoid] then
hit[humanoid] = true
-- Füge ihm einmal Schaden zu
endDie Tabelle wird innerhalb von swing erstellt, sodass jeder Schwung mit einer leeren Tabelle beginnt und zwei Gegner in der Box jeweils einmal getroffen werden.
Aufgabe
EinfachErstelle in swing vor der Schleife local hit = {} und verletze einen Humanoid nur, wenn er noch nicht in hit enthalten ist. Markiere ihn dabei.
Drücke auf Play und dann auf Check.
Probier es selbst
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lastSwing = {} -- player -> Zeitpunkt des letzten Schwertschwungs
-- Roblox’ eigene Schwertanimationen
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"
print("Swords deal " .. Settings.SwordDamage .. " damage")
-- Ein Schwertschwung: erst die Animation, dann werden alle in der Box vor dir getroffen
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()
-- die Box vor dir, niemals dein eigener Körper
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
-- Jeder Spieler erhält Kills auf der Bestenliste und bei jedem neuen Leben ein Schwert
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)
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.