Menu
CoddyTech

Dostań się na szczyt

Lekcja 13 z 18 w kursie Gra Roblox: Wieża bez końca w Coddy.

Złota FinishPad na szczycie wieży kończy wspinaczkę: wygraną i powrót do lobby. stack zwraca umieszczony przez siebie Finish, więc podepnij Touched jego pada właśnie tam.

Touched uruchamia się raz dla każdej kończyny, więc bez ostrożności jedno lądowanie mogłoby dać wygraną trzy lub cztery razy. Przechowuj tabelę graczy, którzy ukończyli tę rundę, i pozwól każdemu graczowi wygrać raz:

local finished = {}

if finished[player] then
	return
end
finished[player] = true

Tabela może używać obiektu Player jako klucza, więc finished[player] to wpis danego gracza. Nowa runda opróżnia tabelę, aby wszyscy mogli wygrać ponownie.

challenge icon

Wyzwanie

Średni
  1. W pobliżu początku: local lobbySpawn = workspace.Lobby.SpawnLocation i local finished = {}.
  2. Napisz reachTop(hit): znajdź gracza; jeśli go nie ma lub już ukończył, zakończ działanie. W przeciwnym razie oznacz go jako osobę, która ukończyła, dodaj 1 do jego Wins, wypisz Name reached the top (jego Name) i przenieś jego postać 4 study nad lobbySpawn.
  3. W buildTower zachowaj obiekt Finish zwracany przez stack i połącz jego FinishPad.Touched z reachTop.
  4. W startRound zacznij od finished = {}.

Wieża w tej lekcji ma 2 sekcje. Naciśnij Play i wygraj. Następnie Check.

Spróbuj swoich sił

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 towerStages = {}
local lava = nil

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

-- Każdy gracz otrzymuje Wins w tabeli wyników
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)

-- Tablica w lobby
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

-- Wszystko oznaczone tagiem Kill odbiera życie
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- Znikający stopień staje się przezroczysty wkrótce po tym, jak ktoś na nim wyląduje, a potem pojawia się ponownie
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

-- Laser przesuwa się do pozycji wyznaczonej przez Slide i z powrotem, bez końca
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

-- Platforma odbijająca wyrzuca w powietrze każdego, kto na niej wyląduje
local function bounce(hit)
	local root = hit.Parent:FindFirstChild("HumanoidRootPart")
	if root then
		root.AssemblyLinearVelocity = Vector3.new(0, Settings.BouncePower, 0)
	end
end

-- Obracające się przeszkody nieznacznie obracają się w każdej klatce
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)

-- Aktywuj wszystkie przeszkody na etapie zgodnie z ich tagami
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

-- Losowo wybrany etap
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- Umieść kopię modelu na szczycie wieży; zwraca kopię i nową wysokość szczytu
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

-- Zbuduj nową losową wieżę od dołu do góry
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	towerStages = {}
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
		towerStages[i] = stage
	end
	stack(ServerStorage.Finish, top)
	return top
end

-- Lawa podnosi się od ziemi do miejsca tuż pod szczytem wieży
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

local function startRound()
	local top = buildTower()
	startLava(top)
	for _, player in Players:GetPlayers() do
		if player.Character then
			player.Character:PivotTo(towerStages[1].Start.CFrame + Vector3.new(0, 4, 0))
		end
	end
end

-- Jedna runda
for i = Settings.Intermission, 1, -1 do
	setBoard("Next tower in " .. i)
	task.wait(1)
end
startRound()
for i = Settings.RoundLength, 1, -1 do
	setBoard("Climb! " .. i .. " seconds left")
	task.wait(1)
end
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Roblox: Wieża bez końca