Menu
CoddyTech
flag Ar iconالعربيةdown icon

دمية التدريب

الدرس 5 من 20 في دورة لعبة Roblox: ساحات القتال على Coddy.

يحتاج الدمية إلى أمرين لتكون دمية تدريب: شريط صحة، وأن تعود عند هزيمتها.

إن HealthBar عبارة عن BillboardGui يحتوي على Fill أخضر داخل Back داكن. تجعل UDim2.fromScale(health / MaxHealth, 1) عرض التعبئة مساويًا لمقدار الصحة المتبقية.

عندما يموت Humanoid الخاص بها (Died)، تذكّر موضع وقوفها (GetPivot)، وأزلها، وانتظر عددًا من الثواني يساوي Settings.DummyRespawn، ثم ضع نسخة جديدة من ServerStorage في مكانها. تحتاج النسخة الجديدة إلى الإعداد نفسه، لذا يكون الإعداد دالة تستدعي نفسها للدمية الجديدة:

local function setupDummy(dummy)
	-- شريط الصحة، وعند Died: ... setupDummy(fresh)
end
setupDummy(workspace.Dummy)
challenge icon

التحدي

سهل

في نهاية السكربت، اكتب setupDummy(dummy):

  1. عند تغيّر صحة Humanoid، غيّر حجم dummy.HealthBar.Back.Fill ليتناسب مع الصحة المتبقية.
  2. عند Died: احتفظ بـ dummy:GetPivot()، وانتظر 0.5 ثانية، ثم دمّره، وانتظر Settings.DummyRespawn، واستنسخ ServerStorage.Dummy، وانقله إلى ذلك الموضع، واجعله ابنًا لـ workspace، ثم أعد إعداده.

استدعِه مع workspace.Dummy. اضغط Play، ثم Check.

جرّب بنفسك

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

local lastSwing = {} -- player -> وقت آخر ضربة له

-- حركات السيف الخاصة بـ Roblox
local slash = Instance.new("Animation")
slash.AnimationId = "rbxassetid://522635514"

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

-- ضربة بالسيف: تُشغَّل الحركة، ثم يُصاب كل من داخل الصندوق أمامك
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()
	-- الصندوق أمامك، ولا يشمل جسمك أبدًا
	local params = OverlapParams.new()
	params.FilterDescendantsInstances = { character }
	local box = root.CFrame * CFrame.new(0, 0, -3)
	local hit = {} -- كل humanoid مرة واحدة في كل ضربة
	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)
		end
	end
end

-- يحصل كل لاعب على Kills في لوحة المتصدرين، وعلى سيف في كل مرة يعود فيها إلى الحياة
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 iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Roblox: ساحات القتال