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.
Wyzwanie
Średni- Napisz
bounce(hit): jeśli model dotykającego obiektu ma elementHumanoidRootPart, ustaw jegoAssemblyLinearVelocitynaVector3.new(0, Settings.BouncePower, 0). - W
setupStagepołącz zdarzenie Touched każdej części oznaczonej tagiemBouncez 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()
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
2Przeszkody
Wirująca przeszkoda