Hình nộm tập luyện
Bài học 5 trên 25 trong khóa học Trò chơi Roblox: Đấu trường của Coddy.
Hình nộm cần có hai thứ để trở thành hình nộm luyện tập: thanh máu và khả năng quay lại sau khi bị đánh bại.
HealthBar của nó là một BillboardGui có Fill màu xanh lá bên trong Back màu tối. UDim2.fromScale(health / MaxHealth, 1) giúp phần tô rộng bằng lượng máu còn lại.
Khi Humanoid của nó Died, hãy ghi nhớ vị trí nó đứng (GetPivot), xóa nó, chờ Settings.DummyRespawn giây rồi đặt một bản sao mới từ ServerStorage vào vị trí đó. Bản mới cũng cần thiết lập tương tự, vì vậy phần thiết lập là một hàm tự gọi lại cho hình nộm mới:
local function setupDummy(dummy)
-- thanh máu, và khi Died: ... setupDummy(fresh)
end
setupDummy(workspace.Dummy)Thử thách
DễTạo thanh máu cho hình nộm và cho nó xuất hiện lại khi bị đánh bại.
- Viết
setupDummy(dummy): khi có sự kiệnHealthChanged, điều chỉnh kích thướcdummy.HealthBar.Back.Filltheo lượng máu còn lại. - Khi có sự kiện
Died: lưu lạidummy:GetPivot(), chờ 0.5 giây rồi hủy hình nộm. - Sau đó, chờ
Settings.DummyRespawn, sao chépServerStorage.Dummyđến vị trí đó trong workspace rồi gọisetupDummycho hình nộm mới. - Gọi
setupDummy(workspace.Dummy).
Nhấn Chơi và đánh bại hình nộm: thanh máu của nó sẽ cạn, rồi nó xuất hiện trở lại. 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 hình hộp trước mặt 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 hình hộp trước mặt 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)
local hit = {} -- Mỗi humanoid chỉ trúng đòn một lần trong mỗi lần vung kiếm
for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
if humanoid and not hit[humanoid] then
hit[humanoid] = true
humanoid:TakeDamage(Settings.SwordDamage)
print(humanoid.Parent.Name .. " is at " .. humanoid.Health)
end
end
end
-- Mỗi lần hồi sinh, người chơi nhận một thanh kiếm
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)
-- Bài học 5: đặt hình nộm tập luyện ở đây
Tất cả bài học trong Trò chơi Roblox: Đấu trường
Tự luyện tập: Playground Roblox