הרצפה היא לבה
שיעור 18 מתוך 18 בקורס משחק Roblox: הישרדות באסונות של Coddy.
את האסון האחרון נשאר לך להשלים: הרצפה הופכת ללבה. אזהרה מראש: במשך 3 שניות היא זוהרת וצבעה משתנה לאדום, ואז היא הופכת לקטלנית. רק ה־Base של המפה משתנה: הסלעים והגגות נשארים בטוחים, כך שלשחקנים יש 3 שניות לטפס.
TweenService:Create(base, TweenInfo.new(3), { Color = Color3.fromRGB(255, 60, 20) }):Play()
task.wait(3)
base.Material = Enum.Material.Neon
base.Touched:Connect(defeat)חשובים כאן שני פרטים. שחקנים שכבר עמדו על האי נגעו בו הרבה קודם, והאירוע Touched מופעל רק כשמגע מתחיל, לכן base:GetTouchingParts() מזהה את מי שנמצא עליו כרגע. בנוסף, האסון הזה ממתין, ולכן הפעלה שלו בדרך הישנה תקפיא את הספירה לאחור של הסבב למשך 3 שניות: הפעילו כל אסון באמצעות task.spawn(Disasters[disaster], map) כדי שירוץ במקביל לספירה לאחור.
בכך השלמת את Disaster Survival. עכשיו המשחק בידיים שלך: המציאו אסון (טורנדו של חלקים מסתובבים, קרח נופל, קיר נע), הוסיפו מפה שפועלת לפי התוכנית של Base ו־Spawn, כוונו את ההגדרות, והשתמשו באפשרות Save as project כדי לשתף קישור שהחברים שלכם יוכלו לשחק בו.
אתגר
קשההוסיפו את הלבה, ואז התאימו את המשחק לטעמכם:
- כתבו
Disasters.Lava(map): השתמשו ב-tween כדי לשנות את Color שלmap.Baseל-Color3.fromRGB(255, 60, 20)במשך 3 שניות, המתינו 3 שניות, שנו אותו ל-Neon, חברו את Touched שלו ל-defeat, והביסו כל חלק שנוגע בו כעת. - הפעילו את האסון של הסיבוב באמצעות
task.spawn(Disasters[disaster], map).
ההגדרות של השיעור הזה מפעילות את הלבה. לחצו על הפעלה, ואז על בדיקה. לאחר מכן הוסיפו אסון משלכם, והגדירו את Settings.Disaster לשם שלו כדי לנסות אותו.
נסו בעצמכם
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
local DataStoreService = game:GetService("DataStoreService")
local Settings = require(game.ReplicatedStorage.Settings)
local lobbySpawn = workspace.LobbySpawn
local winsStore = DataStoreService:GetDataStore("Wins")
print("Rounds last " .. Settings.RoundLength .. " seconds")
-- כל שחקן מקבל Wins ו-Streak בטבלת המובילים
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
local streak = Instance.new("IntValue")
streak.Name = "Streak"
streak.Parent = leaderstats
-- ה-Wins שהשחקן הזה שמר בפעם הקודמת
local ok, saved = pcall(function()
return winsStore:GetAsync(player.UserId)
end)
if ok and saved then
wins.Value = saved
end
end)
local function saveWins(player)
pcall(function()
winsStore:SetAsync(player.UserId, player.leaderstats.Wins.Value)
end)
end
Players.PlayerRemoving:Connect(saveWins)
game:BindToClose(function()
for _, player in Players:GetPlayers() do
saveWins(player)
end
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
local function defeat(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
end
-- תג "Survivor" מרחף מעל ראשו של שחקן
local function tagSurvivor(character)
local tag = Instance.new("BillboardGui")
tag.Name = "SurvivorTag"
tag.Size = UDim2.fromOffset(120, 30)
tag.StudsOffset = Vector3.new(0, 2.5, 0)
tag.Parent = character.Head
local label = Instance.new("TextLabel")
label.Size = UDim2.fromScale(1, 1)
label.BackgroundTransparency = 1
label.Text = "Survivor"
label.TextColor3 = Color3.fromRGB(80, 255, 120)
label.TextScaled = true
label.Parent = tag
end
-- האסונות, לפי שם
local Disasters = {}
function Disasters.Flood(map)
local base = map.Base
local water = Instance.new("Part")
water.Name = "Water"
water.Anchored = true
water.CanCollide = false
water.Transparency = 0.3
water.Color = Color3.fromRGB(40, 120, 255)
water.Size = Vector3.new(base.Size.X + 10, 1, base.Size.Z + 10)
water.Position = base.Position - Vector3.new(0, 2, 0)
water.Parent = map
water.Touched:Connect(defeat)
local rise = TweenInfo.new(Settings.RoundLength * 0.8, Enum.EasingStyle.Linear)
TweenService:Create(water, rise, { Position = water.Position + Vector3.new(0, 8, 0) }):Play()
end
function Disasters.Meteors(map)
local base = map.Base
task.spawn(function()
while map.Parent do
local meteor = Instance.new("Part")
meteor.Name = "Meteor"
meteor.Shape = Enum.PartType.Ball
meteor.Size = Vector3.new(3, 3, 3)
meteor.Color = Color3.fromRGB(255, 120, 30)
meteor.Material = Enum.Material.Neon
local x = base.Position.X + math.random(-15, 15)
local z = base.Position.Z + math.random(-15, 15)
meteor.Position = Vector3.new(x, 40, z)
meteor.Parent = map
meteor.Touched:Connect(defeat)
Debris:AddItem(meteor, 4)
task.wait(0.5)
end
end)
end
function Disasters.Shrink(map)
local base = map.Base
local shrink = TweenInfo.new(Settings.RoundLength * 0.7, Enum.EasingStyle.Linear)
TweenService:Create(base, shrink, { Size = Vector3.new(6, base.Size.Y, 6) }):Play()
end
local function pickDisaster()
if Settings.Disaster then
return Settings.Disaster
end
local names = {}
for name in Disasters do
table.insert(names, name)
end
table.sort(names)
return names[math.random(1, #names)]
end
local function pickMap()
local maps = ServerStorage.Maps
if Settings.Map then
return maps:FindFirstChild(Settings.Map)
end
local all = maps:GetChildren()
return all[math.random(1, #all)]
end
-- לולאת הסיבובים
while true do
for seconds = Settings.Intermission, 1, -1 do
setStatus("Intermission: " .. seconds)
task.wait(1)
end
local template = pickMap()
local map = template:Clone()
map.Name = "Map"
map.Parent = workspace
setStatus("Map: " .. template.Name)
local survivors = {}
for _, player in Players:GetPlayers() do
local character = player.Character
if character and character.Humanoid.Health > 0 then
teleport(player, map.Spawn)
tagSurvivor(character)
survivors[player] = true
character.Humanoid.Died:Connect(function()
survivors[player] = nil
player.leaderstats.Streak.Value = 0
end)
end
end
task.wait(2)
local disaster = pickDisaster()
Disasters[disaster](map)
for seconds = Settings.RoundLength, 1, -1 do
setStatus(disaster .. "! Time left: " .. seconds)
task.wait(1)
end
local names = {}
for player in survivors do
player.leaderstats.Wins.Value += 1
player.leaderstats.Streak.Value += 1
local tag = player.Character and player.Character.Head:FindFirstChild("SurvivorTag")
if tag then
tag:Destroy()
end
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
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.