Menu
CoddyTech

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
end

Die Tabelle wird innerhalb von swing erstellt, sodass jeder Schwung mit einer leeren Tabelle beginnt und zwei Gegner in der Box jeweils einmal getroffen werden.

challenge icon

Aufgabe

Einfach

Erstelle 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)
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Roblox-Spiel: Schlachtfelder