Menu
CoddyTech

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)
challenge icon

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.

  1. Viết setupDummy(dummy): khi có sự kiện HealthChanged, điều chỉnh kích thước dummy.HealthBar.Back.Fill theo lượng máu còn lại.
  2. Khi có sự kiện Died: lưu lại dummy:GetPivot(), chờ 0.5 giây rồi hủy hình nộm.
  3. Sau đó, chờ Settings.DummyRespawn, sao chép ServerStorage.Dummy đến vị trí đó trong workspace rồi gọi setupDummy cho hình nộm mới.
  4. 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