ارتفاع منسوب المياه
الدرس 10 من 18 في دورة لعبة Roblox: النجاة من الكوارث على Coddy.
حان وقت الكارثة الأولى. ستضم اللعبة عدة كوارث، لذا سنضعها في جدول واحد، بحيث تكون كل واحدة منها دالة تأخذ الخريطة. وتُستدعى الدالة المخزنة في جدول مثل أي دالة أخرى:
local Disasters = {}
function Disasters.Flood(map)
-- أنشئ الماء وارفع مستواه
end
Disasters.Flood(map)الفيضان عبارة عن جزء أزرق عريض يبدأ أسفل الجزيرة ويرتفع، لكن ليس إلى القمة: تظل الصخور في Island والأسطح في Rooftops جافة، لذا ينجو اللاعب الذي يتسلق في الوقت المناسب. اللعبة التي لا يستطيع أحد النجاة من كارثتها ليست لعبة. يغيّر TweenService إحدى الخصائص بسلاسة مع مرور الوقت: حدّد المدة باستخدام TweenInfo، وعيّن القيم المستهدفة، ثم استدعِ Play.
local rise = TweenInfo.new(12, Enum.EasingStyle.Linear)
TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()يجب ألا يحمل الماء اللاعبين إلى الأعلى، لذا تكون قيمة CanCollide هي false وتظل قيمة Anchored كما هي. والقضاء على من يلمسه هو المهمة نفسها التي كان يؤديها الحمم في الدورة الأولى؛ وتمنحه هذه اللعبة اسمًا، defeat(hit)، لأن كل كارثة ستستخدمه.
اجعل الماء تابعًا للخريطة، لكي يؤدي تدمير الخريطة في نهاية الجولة إلى إزالة الماء معها.
التحدي
متوسطأضف الفيضان:
- احصل على
TweenServiceفي الأعلى. - اكتب
defeat(hit): إذا كان لدىhit.Parentعنصر Humanoid، فاضبط قيمة Health لديه على 0. - أنشئ
local Disasters = {}وfunction Disasters.Flood(map): جزءًا اسمهWaterفي الخريطة، مثبتًا، وCanCollide غير مفعّل، أزرق وشبه شفاف (Transparency 0.3)، وأعرض بـ 10 studs منmap.Baseفي كل اتجاه، ويبدأ على بُعد 2 studs أسفله. يؤدي لمسه إلى الهزيمة. حرّك Position الخاص به باستخدام Tween بمقدار 8 studs إلى الأعلى خلالSettings.RoundLength * 0.8ثانية، بوتيرة ثابتة (Enum.EasingStyle.Linear)، بحيث يتوقف أسفل قمم الصخور. - استدعِ
Disasters.Flood(map)مباشرة بعد نقل اللاعبين.
اضغط Play وتسابق مع المد: اقفز فوق الصخور إلى يسار نقطة الظهور. ثم اضغط Check.
جرّب بنفسك
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)
local lobbySpawn = workspace.LobbySpawn
print("Rounds last " .. Settings.RoundLength .. " seconds")
-- يحصل كل لاعب على Wins في لوحة المتصدرين
Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local wins = Instance.new("IntValue")
wins.Name = "Wins"
wins.Parent = leaderstats
end)
-- لوحة الحالة في الردهة
local gui = Instance.new("SurfaceGui")
gui.Parent = workspace.StatusBoard
local status = Instance.new("TextLabel")
status.Name = "Status"
status.Size = UDim2.fromScale(1, 1)
status.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
status.TextColor3 = Color3.fromRGB(255, 255, 255)
status.TextScaled = true
status.Text = "Welcome to Disaster Survival!"
status.Parent = gui
local function setStatus(text)
status.Text = text
end
local function teleport(player, target)
local character = player.Character
if character then
character:PivotTo(target.CFrame + Vector3.new(0, 4, 0))
end
end
-- حلقة الجولات
while true do
for seconds = Settings.Intermission, 1, -1 do
setStatus("Intermission: " .. seconds)
task.wait(1)
end
local map = ServerStorage.Maps.Island:Clone()
map.Name = "Map"
map.Parent = workspace
local survivors = {}
for _, player in Players:GetPlayers() do
local character = player.Character
if character and character.Humanoid.Health > 0 then
teleport(player, map.Spawn)
survivors[player] = true
character.Humanoid.Died:Connect(function()
survivors[player] = nil
end)
end
end
for seconds = Settings.RoundLength, 1, -1 do
setStatus("Time left: " .. seconds)
task.wait(1)
end
local names = {}
for player in survivors do
player.leaderstats.Wins.Value += 1
teleport(player, lobbySpawn)
table.insert(names, player.Name)
end
map:Destroy()
if #names > 0 then
setStatus("Winners: " .. table.concat(names, ", "))
else
setStatus("Nobody survived!")
end
task.wait(3)
end
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.