Menu
CoddyTech
flag Ar iconالعربيةdown icon

إنه يمشي

الدرس 9 من 20 في دورة لعبة Roblox: اهرب من الظلام على Coddy.

والآن الوحش. ServerStorage.Shadow نموذج طويل داكن ذو Humanoid، لذا فهو يمشي باستخدام Humanoid:MoveTo مثل أي شخصية غير لاعبة.

عندما تُفتح الغرفة 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 وحدة يضع قدميه على الأرض.

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. اضغط تشغيل، ثم تحقّق.

جرّب بنفسك

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: اهرب من الظلام