Menu
CoddyTech

היא הולכת

שיעור 9 מתוך 20 בקורס משחק Roblox: בריחה מהחושך של Coddy.

עכשיו נעבור למפלצת. ServerStorage.Shadow הוא מודל גבוה וכהה עם Humanoid, ולכן הוא הולך באמצעות Humanoid:MoveTo כמו כל דמות NPC.

כשהחדר Settings.MonsterFrom נפתח, היא מופיעה מאחורי השחקנים: בכניסה לחדר שקודם לחדר החדש ביותר בשניים. המוח שלה הוא לולאה שפועלת בתהליכון משלה: בכל רבע שנייה, היא הולכת לעבר השחקן החי הקרוב ביותר.

monster:PivotTo(behind.Entrance.CFrame + Vector3.new(0, 3.1, 0))
monster.Humanoid.WalkSpeed = Settings.MonsterSpeed
monster.Parent = workspace
task.spawn(runMonster, monster)

נקודת הציר של המודל נמצאת במרכזו, ולכן הרמה שלו ב־3.1 studs מציבה את רגליו על הרצפה.

challenge icon

אתגר

בינוני
  1. הוסף local monster = nil.
  2. כתוב את nearestCharacter(position): הדמות של השחקן החי הקרוב ביותר, והמרחק אליו.
  3. כתוב את runMonster(shadow): כל עוד הוא במשחק, התקדם לעבר הדמות הקרובה ביותר, ואז המתן 0.25 שניות.
  4. כתוב את spawnMonster(): מצא את החדר שמספרו count - 2, שכפל את Shadow אל הכניסה שלו (3.1 למעלה), הגדר את WalkSpeed שלו, קבע את workspace כהורה שלו והפעל את הלולאה שלו.
  5. בתוך addRoom, צור אותו כאשר count הוא Settings.MonsterFrom.

המפלצת בשיעור הזה מגיעה בחדר 3. לחץ על Play, ואז על Check.

נסו בעצמכם

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Lighting = game:GetService("Lighting")
local TweenService = game:GetService("TweenService")
local Settings = require(game.ReplicatedStorage.Settings)

local rooms = workspace.Rooms
local lastRoom = rooms.Lobby -- החדר החדש ביותר
local count = 0 -- החדרים שנוצרו עד כה

-- הלילה יורד: אין שמש, יש מעט אור בכל מקום, וערפל
Lighting.ClockTime = Settings.ClockTime
Lighting.Ambient = Settings.Ambient
Lighting.OutdoorAmbient = Settings.Ambient
Lighting.FogColor = Color3.new(0, 0, 0)
Lighting.FogEnd = Settings.FogEnd
print("Lights out")

-- כלי שהשחקן נושא: בידו או בתוך ה-Backpack שלו
local function findTool(player, name)
	return (player.Character and player.Character:FindFirstChild(name)) or player.Backpack:FindFirstChild(name)
end

-- פתח את הדלת בסיבוב על הציר שלה
local function openDoor(door)
	door:SetAttribute("Open", true)
	door.Panel.Prompt.Enabled = false
	local hinge, panel = door.Hinge, door.Panel
	local goal = hinge.CFrame * CFrame.Angles(0, math.rad(90), 0) * hinge.CFrame:ToObjectSpace(panel.CFrame)
	TweenService:Create(panel, TweenInfo.new(0.6), { CFrame = goal }):Play()
end

local addRoom -- מוגדר בהמשך: דלת מוסיפה חדר, ולחדר יש דלת

-- מה קורה בדלת כששחקן פותח אותה
local function setupDoor(door)
	door.Panel.Prompt.Triggered:Connect(function(player)
		if door:GetAttribute("Open") then
			return
		end
		if door:GetAttribute("Locked") then
			local key = findTool(player, "Key")
			if not key then
				return
			end
			key:Destroy()
			door:SetAttribute("Locked", nil)
		end
		if door.Parent == lastRoom then
			addRoom()
		end
		openDoor(door)
	end)
end
setupDoor(workspace.Rooms.Lobby.Door)

-- כניסה לחדר: הוא הופך ל-Room של השחקן ולנקודת השמירה שלו
local function setupEntry(room)
	room.Entry.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player then
			local number = room:GetAttribute("Number")
			player.leaderstats.Room.Value = number
			player.RespawnLocation = room.Checkpoint
		end
	end)
end
setupEntry(workspace.Rooms.Lobby)

-- חדר חדש ביציאה מהחדר החדש ביותר
function addRoom()
	count += 1
	local name = Settings.Order[(count - 1) % #Settings.Order + 1]
	if count >= Settings.RoomsToEscape then
		name = "Exit"
	end
	local room = ServerStorage.Rooms[name]:Clone()
	room:PivotTo(lastRoom.Exit.CFrame)
	room:SetAttribute("Number", count)
	room.Sign.SurfaceGui.Number.Text = "Room " .. count
	room.Parent = rooms
	lastRoom = room
	setupDoor(room.Door)
	setupEntry(room)
	-- חדר נעול שומר את המפתח שלו בתוכו
	local keySpot = room:FindFirstChild("KeySpot")
	if keySpot then
		local key = ServerStorage.Key:Clone()
		key.Handle.CFrame = keySpot.CFrame
		key.Parent = room
		key.Handle.Prompt.Triggered:Connect(function(player)
			key.Handle.Prompt.Enabled = false
			key.Parent = player.Backpack
		end)
	end
	-- שמור את החדר החדש ביותר ועוד KeepRooms חדרים מאחוריו
	for _, old in rooms:GetChildren() do
		if old:GetAttribute("Number") < count - Settings.KeepRooms then
			old:Destroy()
		end
	end
	return room
end

-- לכל שחקן: Room בטבלת המובילים, ופנס בכל פעם שהוא נוצר מחדש
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local room = Instance.new("IntValue")
	room.Name = "Room"
	room.Parent = leaderstats

	player.CharacterAdded:Connect(function()
		local flashlight = ServerStorage.Flashlight:Clone()
		flashlight.Parent = player.Backpack
		local beam = flashlight.Handle.Beam
		flashlight.Activated:Connect(function()
			beam.Enabled = not beam.Enabled
		end)
	end)
end)
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה משחק Roblox: בריחה מהחושך