הצפה מתגברת
שיעור 10 מתוך 18 בקורס משחק Roblox: הישרדות באסונות של Coddy.
הגיע הזמן לאסון הראשון. יהיו כמה כאלה במשחק, ולכן הם יאוחסנו בטבלה אחת, כל אחד מהם פונקציה שמקבלת את המפה. קוראים לפונקציה המאוחסנת בטבלה כמו לכל פונקציה אחרת:
local Disasters = {}
function Disasters.Flood(map)
-- צור את המים והעלה את מפלסם
end
Disasters.Flood(map)השיטפון הוא חלק כחול ורחב שמתחיל מתחת לאי ועולה, אבל לא עד למעלה: הסלעים באי והגגות בגגות נשארים יבשים, כך ששחקן שמטפס בזמן שורד. אסון שאיש לא יכול לשרוד הוא לא משחק. 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 שלו 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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.