אסון אקראי
שיעור 14 מתוך 20 בקורס משחק Roblox: הישרדות באסונות של Coddy.
משחק נעשה משעמם כשכבר יודעים מה עומד לקרות. בכל סיבוב יש לבחור אסון באקראי, אלא אם Settings.Disaster מציין אחד, וזה שימושי לבדיקת אסון חדש.
אפשר לאתר פונקציה בטבלה לפי שמה כמחרוזת: Disasters["Meteors"] הוא Disasters.Meteors, ולכן Disasters[name](map) מפעיל את האסון שמופיע ב-name. שם שאינו מופיע בטבלה מחזיר nil, וקריאה ל-nil היא שגיאה, לכן יש לבדוק את Disasters[Settings.Disaster] לפני שמסתמכים על ההגדרה.
כדי לבחור באקראי, יש לרשום את המפתחות של הטבלה ולבחור מיקום. for name in Disasters do עובר על המפתחות ללא סדר קבוע, לכן ממיינים תחילה את הרשימה: כך אותו מספר אקראי תמיד יבחר באותו אסון, מה שמקל על בדיקת המשחק.
local names = {}
for name in Disasters do
table.insert(names, name)
end
table.sort(names)
local pick = names[math.random(1, #names)]השחקנים צריכים לדעת מה פגע בהם, לכן הספירה לאחור מציינת את שם האסון: Flood! Time left: 15.
אתגר
בינוניבחרו אסון אקראי בכל סבב.
- כתבו את
pickDisaster(): אםDisasters[Settings.Disaster]קיים, החזירו אתSettings.Disaster; אחרת, החזירו שם אקראי מתוך הרשימה הממוינת של מפתחות הטבלה. - בסבב:
local disaster = pickDisaster(), ואזDisasters[disaster](map). - הציגו את
disaster .. "! Time left: " .. secondsבספירה לאחור.
לחצו על "שחק" במשך כמה סבבים: הלוח מציג את שם האסון בכל פעם, למשל Flood! Time left: 15. לאחר מכן לחצו על "בדיקה".
נסו בעצמכם
local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local TweenService = game:GetService("TweenService")
local Debris = game:GetService("Debris")
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
local function defeat(hit)
local humanoid = hit.Parent:FindFirstChild("Humanoid")
if humanoid then
humanoid.Health = 0
end
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
-- שיעור 14: אסון אקראי יופיע כאן
-- לולאת הסיבובים
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
Disasters.Shrink(map)
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
כל השיעורים ביחידה משחק Roblox: הישרדות באסונות
תרגלו בעצמכם: Roblox אונליין