Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Written by Asinphi (aka JL on Discord)
- local RunService = game:GetService("RunService")
- local CameraTrack = {}
- CameraTrack.__index = CameraTrack
- function CameraTrack.load(folder, fps)
- local fovFolder = folder:FindFirstChild("FOV")
- local framesFolder = folder:FindFirstChild("Frames")
- assert(fovFolder ~= nil, "CameraTrack: There's no folder named 'FOV' inside here!")
- assert(framesFolder ~= nil, "CameraTrack: There's no folder named 'Frames' inside here!")
- local self = setmetatable({}, CameraTrack)
- self.FOV = fovFolder:GetChildren()
- self.Frames = framesFolder:GetChildren()
- local function sortNumericalNames(a, b)
- return tonumber(a.Name) < tonumber(b.Name)
- end
- table.sort(self.FOV, sortNumericalNames)
- table.sort(self.Frames, sortNumericalNames)
- self.IsPlaying = false
- self.Speed = 1
- self.TimePosition = 0
- self.FPS = fps or 60
- self.Length = #self.Frames / self.FPS
- self.PreviousCameraType = nil
- if folder:FindFirstChild("Settings") and folder.Settings:FindFirstChild("Loop") then
- self.Looped = folder.Settings.Loop.Value
- else
- self.Looped = false
- end
- return self
- end
- function CameraTrack:Play(camera)
- self.Camera = camera or workspace.CurrentCamera
- self.PreviousCameraType = self.PreviousCameraType or self.Camera.CameraType
- self.IsPlaying = true
- self.Camera.CameraType = Enum.CameraType.Scriptable
- local interval = (1/self.FPS) * self.Speed -- Interval between frames
- self.Heartbeat = RunService.RenderStepped:Connect(function(deltaTime)
- local kf = self.TimePosition / interval + 1
- local kfIndex = math.floor(kf)
- local alpha = kf - kfIndex
- local success = pcall(function()
- self.Camera.CFrame = self.Frames[kfIndex].Value:Lerp(self.Frames[kfIndex + 1].Value, alpha)
- local fov = self.FOV[kfIndex].Value
- self.Camera.FieldOfView = fov + (self.FOV[kfIndex + 1].Value - fov) * alpha
- end)
- if not success then -- Reached all the keyframes
- self.Heartbeat:Disconnect()
- self.IsPlaying = false
- self.Camera.CameraType = self.PreviousCameraType
- return
- end
- self.TimePosition = self.TimePosition + deltaTime
- end)
- end
- function CameraTrack:Stop() -- Well, it really pauses it
- self.Heartbeat:Disconnect()
- self.IsPlaying = false
- self.Camera.CameraType = self.PreviousCameraType
- end
- return CameraTrack
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement