Menu
CoddyTech

Poduszki odbijające

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

Etap Bounce ma zielony pad oznaczony tagiem Bounce, znajdujący się pod krawędzią zbyt wysoko, by na nią wskoczyć. Lądowanie na padzie powinno wyrzucić cię na górę.

Postać porusza się za pomocą HumanoidRootPart, niewidocznej części znajdującej się pośrodku. Ustaw AssemblyLinearVelocity tej części, a postać poleci w tym kierunku, po czym grawitacja sprowadzi ją w dół:

root.AssemblyLinearVelocity = Vector3.new(0, 60, 0) -- 60 studów na sekundę, pionowo w górę

Touched przekazuje ci część ciała, która uderzyła w pad — zwykle nogę. Jej rodzicem jest postać, która zawiera HumanoidRootPart.

challenge icon

Wyzwanie

Średni
  1. Napisz bounce(hit): jeśli model dotykającego obiektu ma element HumanoidRootPart, ustaw jego AssemblyLinearVelocity na Vector3.new(0, Settings.BouncePower, 0).
  2. W setupStage połącz zdarzenie Touched każdej części oznaczonej tagiem Bounce z tą funkcją.

Naciśnij Play, wyląduj na platformie i skieruj się na półkę. Następnie naciśnij 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

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

-- Każdy gracz otrzymuje Wins na tablicy 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)

-- Dotknięcie czegokolwiek z 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ń znika wkrótce po tym, jak ktoś na nim stanie, 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ę o wartość 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

-- Wirujące przeszkody obracają się trochę 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 na podstawie ich tagów
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
	end
end

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

-- Umieść kopię modelu na szczycie wieży; zwróć 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
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
	end
	stack(ServerStorage.Finish, top)
end

buildTower()
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