مرة واحدة لكل تلويحة
الدرس 4 من 20 في دورة لعبة Roblox: ساحات القتال على Coddy.
ألحقت ضربة واحدة 30 نقطة ضرر بالدمية. جذرها وساقاها ورأسها أجزاء ثلاثة، وكلها داخل الصندوق، وقد أصاب كل جزء منها كائن Humanoid نفسه.
يحلّ جدول هذه المشكلة: تذكّر كل كائن Humanoid أصابته هذه الضربة، وتجاوز أيًّا منها سبق أن رأيته. يمكن أن تكون مفاتيح الجدول كائنات:
local hit = {}
if humanoid and not hit[humanoid] then
hit[humanoid] = true
-- ألحق به الضرر مرة واحدة
endيُنشأ الجدول داخل swing، لذا تبدأ كل ضربة بجدول فارغ، ويُصاب كلٌّ من العدوين الموجودين في الصندوق مرة واحدة.
التحدي
سهلداخل swing، أنشئ local hit = {} قبل الحلقة، وألحق الضرر بـ Humanoid فقط إذا لم يكن موجودًا في hit بعد، مع تسجيله عند إلحاق الضرر به.
اضغط على 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)
for _, part in workspace:GetPartBoundsInBox(box, Settings.HitboxSize, params) do
local humanoid = part.Parent:FindFirstChildOfClass("Humanoid")
if humanoid then
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)
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.