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
endBả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.
Thử thách
DễĐánh trúng mỗi kẻ địch một lần trong mỗi cú vung kiếm.
- Trong
swing, thêmlocal hit = {}trước vòng lặp. - Chỉ gây sát thương cho Humanoid khi
if humanoid and not hit[humanoid], rồi đặthit[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