Menu
CoddyTech

Mỗi lần vung kiếm

Bài học 4 trên 25 trong khóa học Trò chơi Roblox: Đấu trường của Coddy.

Một cú vung đã in ra ba dòng và khiến hình nộm mất 30 máu. Phần gốc, chân và đầu là ba bộ phận, tất cả đều nằm trong hộp, và mỗi bộ phận đều làm cùng một Humanoid bị thương.

Một bảng sẽ khắc phục điều này: ghi nhớ mọi Humanoid mà cú vung này đã đánh trúng, rồi bỏ qua những Humanoid bạn đã gặp. Khóa của bảng có thể là các instance:

local hit = {}
if humanoid and not hit[humanoid] then
	hit[humanoid] = true
	-- gây sát thương cho nó một lần
end

Bảng được tạo bên trong swing, nên mỗi cú vung bắt đầu với một bảng trống, và hai kẻ địch trong hộp mỗi kẻ đều chỉ bị đánh trúng một lần.

challenge icon

Thử thách

Dễ

Đánh trúng mỗi kẻ địch một lần trong mỗi cú vung kiếm.

  1. Trong swing, thêm local hit = {} trước vòng lặp.
  2. Chỉ gây sát thương cho Humanoid khi if humanoid and not hit[humanoid], rồi đặt hit[humanoid] = true.

Nhấn Chơi rồi đánh hình nộm: Output hiển thị Dummy is at 90 một lần. Sau đó nhấn Kiểm tra.

Tự làm thử

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

local lastSwing = {} -- player: thời điểm vung kiếm gần nhất

-- Hoạt ảnh vung kiếm có sẵn của Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

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

-- Một lần vung kiếm: phát hoạt ảnh, rồi đánh trúng mọi người trong vùng phía trước bạn
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()
	-- Vùng phía trước bạn, không bao gồm cơ thể bạn
	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")
		-- Bài học 4: Thêm phần xử lý một lần cho mỗi lần vung kiếm tại đây
		if humanoid then
			humanoid:TakeDamage(Settings.SwordDamage)
			print(humanoid.Parent.Name .. " is at " .. humanoid.Health)
		end
	end
end

-- Mỗi người chơi nhận một thanh kiếm mỗi khi hồi sinh
Players.PlayerAdded:Connect(function(player)
	player.CharacterAdded:Connect(function()
		local sword = ServerStorage.Sword:Clone()
		sword.Parent = player.Backpack
		sword.Activated:Connect(function()
			swing(player)
		end)
	end)
end)

Tất cả bài học trong Trò chơi Roblox: Đấu trường

Tự luyện tập: Playground Roblox