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

إلى داخل البرج

الدرس 12 من 18 في دورة لعبة Roblox: البرج اللانهائي على Coddy.

عندما ينتهي العد التنازلي، تبدأ الجولة: ابنِ البرج، وشغّل الحمم، وانقل كل لاعب إلى المرحلة الأولى. احتفظ بالمراحل في جدول أثناء بنائها، بحيث تكون towerStages[1] هي المرحلة السفلية:

towerStages[i] = stage

الشخصية هي كائن من النوع Model، لذا ينقلها PivotTo كاملةً. ضعها على ارتفاع بضعة ستودات فوق منصة Start، لا داخلها، وستهبط عليها:

player.Character:PivotTo(towerStages[1].Start.CFrame + Vector3.new(0, 4, 0))

ثم تعدّ اللوحة تنازليًا للجولة، بالطريقة نفسها المتبعة في الردهة.

challenge icon

التحدي

متوسط
  1. بالقرب من الأعلى: local towerStages = {}. في buildTower، أفرغها في البداية وخزّن كل مرحلة على النحو التالي: towerStages[i] = stage.
  2. اكتب startRound(): ابنِ البرج، وابدأ الحمم، وانقل شخصية كل لاعب إلى ارتفاع 4 وحدات (studs) فوق towerStages[1].Start.
  3. في الأسفل: بعد العد التنازلي في الردهة، استدعِ startRound()، ثم ابدأ العد التنازلي من Settings.RoundLength، مع عرض Climb! 20 seconds left، ثم Climb! 19 seconds left، ...

اضغط على Play. ثم Check.

جرّب بنفسك

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

local stages = ServerStorage.Stages
local tower = nil
local lava = nil

print("Each tower has " .. Settings.StageCount .. " stages")

-- يحصل كل لاعب على 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.Lobby.Board

local boardLabel = Instance.new("TextLabel")
boardLabel.Name = "Status"
boardLabel.Size = UDim2.fromScale(1, 1)
boardLabel.BackgroundColor3 = Color3.fromRGB(25, 25, 35)
boardLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
boardLabel.TextScaled = true
boardLabel.Text = "Endless Tower"
boardLabel.Parent = gui

local function setBoard(text)
	boardLabel.Text = text
end

-- أي شيء يحمل الوسم Kill ينهي حياة اللاعب
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- تتلاشى درجة الاختفاء بعد وقت قصير من هبوط أحدهم عليها، ثم تعود
local function makeVanish(part)
	part.Touched:Connect(function(hit)
		if part:GetAttribute("Gone") or not hit.Parent:FindFirstChild("Humanoid") then
			return
		end
		part:SetAttribute("Gone", true)
		task.wait(Settings.VanishDelay)
		part.Transparency = 0.8
		part.CanCollide = false
		task.wait(Settings.VanishTime)
		part.Transparency = 0
		part.CanCollide = true
		part:SetAttribute("Gone", nil)
	end)
end

-- ينزلق الليزر إلى موضعه المزاح بمقدار Slide ثم يعود، إلى ما لا نهاية
local function makeSlide(part)
	local info = TweenInfo.new(Settings.SlideTime, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1, true)
	local goal = { Position = part.Position + part:GetAttribute("Slide") }
	TweenService:Create(part, info, goal):Play()
end

-- تقذف منصة القفز من يهبط عليها إلى أعلى في الهواء
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
	end
end

-- تدور العناصر الدوّارة قليلًا في كل إطار
RunService.Heartbeat:Connect(function(dt)
	for _, spinner in CollectionService:GetTagged("Spinner") do
		if spinner:IsDescendantOf(workspace) then
			spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0))
		end
	end
end)

-- فعّل كل عقبة في المرحلة بحسب وسومها
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
		if part:HasTag("Vanish") then
			makeVanish(part)
		end
		if part:HasTag("Conveyor") then
			part.AssemblyLinearVelocity = part.CFrame.LookVector * Settings.BeltSpeed
		end
		if part:HasTag("Slider") then
			makeSlide(part)
		end
		if part:HasTag("Bounce") then
			part.Touched:Connect(bounce)
		end
	end
end

-- اختر مرحلة عشوائيًا
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- ضع نسخة من نموذج فوق البرج؛ وأعِد النسخة والارتفاع الجديد لقمة البرج
local function stack(template, bottom)
	local copy = template:Clone()
	local box, size = copy:GetBoundingBox()
	local lift = bottom - (box.Position.Y - size.Y / 2)
	copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
	copy.Parent = tower
	return copy, bottom + size.Y
end

-- ابنِ برجًا عشوائيًا جديدًا من الأسفل إلى الأعلى
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
	end
	stack(ServerStorage.Finish, top)
	return top
end

-- ترتفع الحمم من الأرض إلى ما دون قمة البرج بقليل
local function startLava(top)
	lava = Instance.new("Part")
	lava.Name = "Lava"
	lava.Anchored = true
	lava.CanCollide = false
	lava.Size = Vector3.new(30, 2, 30)
	lava.Position = Vector3.new(0, -2, 0)
	lava.Color = Color3.fromRGB(255, 90, 20)
	lava.Material = Enum.Material.Neon
	lava.Parent = workspace
	lava.Touched:Connect(killOnTouch)
	local info = TweenInfo.new(top / Settings.LavaSpeed, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, 0, false, Settings.LavaDelay)
	TweenService:Create(lava, info, { Position = Vector3.new(0, top - 2, 0) }):Play()
end

-- ابدأ العد التنازلي، ثم ابنِ البرج
for i = Settings.Intermission, 1, -1 do
	setBoard("Next tower in " .. i)
	task.wait(1)
end
local top = buildTower()
startLava(top)
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس لعبة Roblox: البرج اللانهائي