Menu
CoddyTech

הצפה מתגברת

שיעור 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), כי כל אסון ישתמש בה.

הציבו את המים בתוך המפה, כך שכאשר המפה תושמד בסוף הסיבוב, המים יושמדו יחד איתה.

challenge icon

אתגר

בינוני

הוסיפו את השיטפון:

  1. קבלו את TweenService בחלק העליון.
  2. כתבו defeat(hit): אם ל־hit.Parent יש Humanoid, הגדירו את Health שלו ל־0.
  3. צרו את 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), כך שהוא נעצר מתחת לחלק העליון של הסלעים.
  4. קראו ל־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
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

כל השיעורים ביחידה משחק Roblox: הישרדות באסונות