-- Serviços necessários local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local Camera = workspace.CurrentCamera -- Desativa o controle de toque padrão do Roblox para o script assumir LocalPlayer.DevTouchMovementMode = Enum.DevTouchMovementMode.Scriptable -- Criação da Interface (GUI) local gui = Instance.new("ScreenGui") gui.Name = "AnalogicoDeltaCustomizado" gui.ResetOnSpawn = false -- Tenta colocar no CoreGui (esconde do jogo) ou no PlayerGui local success = pcall(function() gui.Parent = gethui and gethui() or game:GetService("CoreGui") end) if not success then gui.Parent = LocalPlayer:WaitForChild("PlayerGui") end -- 1. ZONA DE TOQUE E ANALÓGICO (Totalmente invisível e livre de visão) local zonaToque = Instance.new("TextButton") zonaToque.Size = UDim2.new(0, 240, 0, 240) zonaToque.Position = UDim2.new(0, 10, 1, -230) -- Fixo na marcação branca zonaToque.BackgroundTransparency = 1 zonaToque.Text = "" zonaToque.AutoButtonColor = false zonaToque.Active = true zonaToque.Parent = gui local fundoAnalogico = Instance.new("Frame") fundoAnalogico.Size = UDim2.new(0, 140, 0, 140) fundoAnalogico.Position = UDim2.new(0.5, -70, 0.5, -70) fundoAnalogico.BackgroundTransparency = 1 fundoAnalogico.AnchorPoint = Vector2.new(0, 0) fundoAnalogico.Visible = true fundoAnalogico.Parent = zonaToque -- 2. PINO DO ANALÓGICO (Botão Verde) local pinoAnalogico = Instance.new("Frame") pinoAnalogico.Size = UDim2.new(0, 50, 0, 50) pinoAnalogico.BackgroundColor3 = Color3.new(0, 1, 0) pinoAnalogico.BackgroundTransparency = 0.3 pinoAnalogico.AnchorPoint = Vector2.new(0.5, 0.5) pinoAnalogico.Position = UDim2.new(0.5, 0, 0.5, 0) pinoAnalogico.Parent = fundoAnalogico local cantoPino = Instance.new("UICorner") cantoPino.CornerRadius = UDim.new(1, 0) cantoPino.Parent = pinoAnalogico -- 3. BOTÃO DE PULO CUSTOMIZADO (Simples e funcional) local botaoPuloCustom = Instance.new("ImageButton") botaoPuloCustom.Name = "JumpButtonCustom" botaoPuloCustom.Size = UDim2.new(0, 70, 0, 70) botaoPuloCustom.Position = UDim2.new(1, -110, 1, -130) botaoPuloCustom.BackgroundColor3 = Color3.fromRGB(45, 45, 45) botaoPuloCustom.BackgroundTransparency = 0.3 botaoPuloCustom.Image = "rbxassetid://6074252252" botaoPuloCustom.AutoButtonColor = true botaoPuloCustom.Parent = gui local cantoPulo = Instance.new("UICorner") cantoPulo.CornerRadius = UDim.new(1, 0) cantoPulo.Parent = botaoPuloCustom local bordaPulo = Instance.new("UIStroke") bordaPulo.Color = Color3.fromRGB(80, 80, 80) bordaPulo.Thickness = 2 bordaPulo.Parent = botaoPuloCustom -- Variável para controlar o pulo contínuo sem delay local estaPulando = false botaoPuloCustom.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then estaPulando = true end end) local function soltarPulo(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then estaPulando = false end end botaoPuloCustom.InputEnded:Connect(soltarPulo) UserInputService.InputEnded:Connect(soltarPulo) -- Variáveis de controle de movimento do analógico local toqueAtual = nil local vetorMovimento = Vector2.new(0, 0) local raioMaximo = 35 -- Raio menor: anda devagar só pertinho do centro e atinge velocidade máxima rapidamente -- Detecta quando o dedo/mouse pressiona a zona do analógico zonaToque.InputBegan:Connect(function(input) if (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1) and toqueAtual == nil then toqueAtual = input vetorMovimento = Vector2.new(0, 0) end end) -- Detecta o dedo/mouse arrastando UserInputService.InputChanged:Connect(function(input) if input == toqueAtual and (input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement) then local absPos = fundoAnalogico.AbsolutePosition local absSize = fundoAnalogico.AbsoluteSize local centroX = absPos.X + (absSize.X / 2) local centroY = absPos.Y + (absSize.Y / 2) local delta = Vector2.new(input.Position.X, input.Position.Y) - Vector2.new(centroX, centroY) local distancia = delta.Magnitude -- O pino verde continua indo longe livremente (até 110 pixels) local raioVisualMax = 110 local pinoDelta = delta if distancia > raioVisualMax then pinoDelta = delta.Unit * raioVisualMax end pinoAnalogico.Position = UDim2.new(0.5, pinoDelta.X, 0.5, pinoDelta.Y) -- Movimento limpo: Lento apenas bem perto do centro (zona morta de 4 pixels), rápido no resto if distancia > 4 then vetorMovimento = delta / raioMaximo if vetorMovimento.Magnitude > 1 then vetorMovimento = vetorMovimento.Unit end else vetorMovimento = Vector2.new(0, 0) end end end) -- Função para soltar o analógico local function soltarAnalogico(input) if input == toqueAtual then toqueAtual = nil vetorMovimento = Vector2.new(0, 0) pinoAnalogico.Position = UDim2.new(0.5, 0, 0.5, 0) end end zonaToque.InputEnded:Connect(soltarAnalogico) UserInputService.InputEnded:Connect(soltarAnalogico) -- Loop principal: Movimento fluido e limpo RunService.RenderStepped:Connect(function() local personagem = LocalPlayer.Character if personagem and personagem:FindFirstChild("Humanoid") then if vetorMovimento.Magnitude > 0 then local lookVector = Camera.CFrame.LookVector local rightVector = Camera.CFrame.RightVector local frente = Vector3.new(lookVector.X, 0, lookVector.Z).Unit local direita = Vector3.new(rightVector.X, 0, rightVector.Z).Unit local direcaoMundo = (frente * -vetorMovimento.Y) + (direita * vetorMovimento.X) personagem.Humanoid:Move(direcaoMundo, false) else personagem.Humanoid:Move(Vector3.new(0, 0, 0), false) end if estaPulando then personagem.Humanoid.Jump = true end end end)