0% found this document useful (0 votes)
547 views8 pages

Roblox GUI Morphing Script

The document outlines a Lua script for creating a graphical user interface (GUI) in a game using Roblox services. It includes initialization of parameters, state management, input handling, and animations for opening and minimizing the GUI. The script also manages user interactions and visual effects, such as blurring the background and displaying user information.

Uploaded by

pintimakar2
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
547 views8 pages

Roblox GUI Morphing Script

The document outlines a Lua script for creating a graphical user interface (GUI) in a game using Roblox services. It includes initialization of parameters, state management, input handling, and animations for opening and minimizing the GUI. The script also manages user interactions and visual effects, such as blurring the background and displaying user information.

Uploaded by

pintimakar2
Copyright
© All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd

ОРИГ: -- ====== 1.

СЕРВИСЫ ======
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local TweenService = game:GetService("TweenService")
local Lighting = game:GetService("Lighting")

local player = [Link]


local playerGui = player:WaitForChild("PlayerGui")
local camera = [Link]

-- ====== 2. ИНИЦИАЛЬНАЯ ПОЗИЦИЯ ======


local INIT_POS = [Link](0, 50, 0, 50)

-- ====== 3. ПАРАМЕТРЫ / КОНСТАНТЫ ======


local CONST = {
STIFF_POS = 245, DAMP_POS = 15, MASS_POS = 1,
STIFF_SZ = 200, DAMP_SZ = 12, MASS_SZ = 1,
IDLE_SIZE = [Link](50,50),
PRESSED_SIZE = [Link](65,65),
PRESS_OFF = [Link](0,3),
DRAG_THR = 10,
GUI_SIZE = [Link](0,500,0,300),
GUI_RAD = [Link](0,24),
ANIM_T = 0.4,
}

-- ====== 4. СОСТОЯНИЕ ======


local state = {
origFOV = [Link],
targetPos, currentPos = INIT_POS, INIT_POS,
velPos = [Link],
targetSz, currentSz = CONST.IDLE_SIZE, CONST.IDLE_SIZE,
velSz = [Link],
dragInput, startPt, didDrag = nil, nil, false,
allowGrow = true,
isOpen, isTween = false, false,
savedPos, blurEf, overlay = nil, nil, nil,
btnMinimize, btnClose = nil, nil,
firstOpen = true,
lastSelectedTabIndex = nil,
}

-- ====== 5. HELPERS ======


local function toUDim2(v) return [Link](v.X, v.Y) end
local function dist(a,b) return (a - b).Magnitude end

-- ====== 6. СОЗДАНИЕ GUI ======


local screenGui = [Link]("ScreenGui", playerGui)
[Link] = "MorphGUI"
[Link] = false

local container = [Link]("Frame", screenGui)


[Link] = "MorphContainer"
[Link] = [Link](0.5,0.5)
[Link] = [Link]
[Link] = [Link]([Link].X, [Link].Y)
container.BackgroundColor3 = [Link](30,30,30)
[Link] = 0
[Link] = true

local contCorner = [Link]("UICorner", container)


[Link] = [Link](1,0)

local contStroke = [Link]("UIStroke", container)


[Link] = 2
[Link] = 0.5

local inputBtn = [Link]("ImageButton", container)


[Link] = "InputButton"
[Link] = [Link](1,0,1,0)
[Link] = 1
[Link] = false
[Link] = true

-- ====== 7. SPRING-LOOP ======


[Link]:Connect(function(dt)
if [Link] or [Link] then return end
-- позиция
do
local c = [Link]([Link], [Link])
local t = [Link]([Link], [Link])
local f = -CONST.STIFF_POS*(c - t) - CONST.DAMP_POS*[Link]
local a = f / CONST.MASS_POS
[Link] = [Link] + a*dt
c = c + [Link]*dt
[Link] = [Link](c.X, c.Y)
[Link] = [Link]
end
-- размер
do
local ds = [Link] - [Link]
local fs = -CONST.STIFF_SZ*ds - CONST.DAMP_SZ*[Link]
local asz = fs / CONST.MASS_SZ
[Link] = [Link] + asz*dt
[Link] = [Link] + [Link]*dt
[Link] = [Link]([Link].X, [Link].Y)
end
end)

-- ====== 8. INPUT HANDLERS ======


[Link]:Connect(function(inp)
if [Link] or [Link] then return end
if [Link] == [Link].MouseButton1 or [Link] ==
[Link] then
[Link], [Link], [Link] = inp, [Link], false
if [Link] then
[Link] = CONST.PRESSED_SIZE
[Link] = toUDim2([Link]([Link],
[Link]) + CONST.PRESS_OFF)
end
end
end)

[Link]:Connect(function(inp)
if [Link] or [Link] then return end
if inp == [Link] then
if not [Link] and dist([Link], [Link]) > CONST.DRAG_THR
then
[Link], [Link] = true, [Link]
[Link], [Link] = CONST.IDLE_SIZE, false
end
if [Link] then
[Link] = toUDim2([Link])
end
end
end)

[Link]:Connect(function(inp)
if [Link] or [Link] then return end
if inp == [Link] then
if not [Link] then
[Link], [Link] = [Link], [Link]
[Link] = true
[Link] = [Link]
openMenu()
else
[Link] = CONST.IDLE_SIZE
end
[Link], [Link], [Link] = nil, false, true
end
end)

-- ====== 9. OPEN MENU ======


function openMenu()
[Link] = false
[Link] = true

-- камера + blur
TweenService:Create(camera, [Link](CONST.ANIM_T), {FieldOfView =
[Link] - 20}):Play()
[Link] = [Link]("BlurEffect", Lighting); [Link] = 0
TweenService:Create([Link], [Link](CONST.ANIM_T), {Size =
24}):Play()

-- overlay
[Link] = [Link]("Frame", playerGui)
[Link], [Link] = [Link](1,0,1,0), [Link]()
[Link].BackgroundColor3 = [Link](0,0,0)
[Link] = 1
TweenService:Create([Link], [Link](CONST.ANIM_T),
{BackgroundTransparency = 0.5}):Play()

-- expand container
TweenService:Create(contCorner, [Link](CONST.ANIM_T), {CornerRadius =
CONST.GUI_RAD}):Play()
TweenService:Create(contStroke, [Link](CONST.ANIM_T), {Transparency =
1}):Play()
local tweenCont = TweenService:Create(container,
[Link](CONST.ANIM_T, [Link]),
{Size = CONST.GUI_SIZE, Position = [Link](0.5,0,0.5,0)}
)
tweenCont:Play()

[Link]:Connect(function()
-- === AvatarGreeting ===
local greet = container:FindFirstChild("AvatarGreeting")
if not greet then
greet = [Link]("Frame", container)
[Link] = "AvatarGreeting"
[Link] = [Link](0,1)
[Link] = [Link](0,10,1,-10)
[Link] = 1
[Link] = [Link](0,150,0,40)
else
[Link] = true
end

-- avatar + stroke (теперь серая обводка)


local avatar = greet:FindFirstChild("Avatar")
local stroke
if not avatar then
avatar = [Link]("ImageLabel", greet)
[Link] = "Avatar"
[Link] = [Link](0,36,0,36)
[Link] = [Link](0,4,0,2)
[Link] = 1
[Link] = 1
[Link] = Players:GetUserThumbnailAsync([Link],
[Link], [Link].Size48x48)
[Link]("UICorner", avatar).CornerRadius = [Link](1,0)
stroke = [Link]("UIStroke", avatar)
[Link], [Link] = [Link](150,150,150), 1
[Link] = 1
else
stroke = avatar:FindFirstChildOfClass("UIStroke")
[Link] = 1
if stroke then [Link] = 1; [Link] =
[Link](150,150,150) end
end

-- тексты
for _,name in ipairs({"HelloText","EnjoyText"}) do
local ex = greet:FindFirstChild(name)
if ex then ex:Destroy() end
end
local textX = 4 + 36 + 6
local ht = [Link]("TextLabel", greet)
[Link] = "HelloText"
[Link] = [Link](0,textX,0,4)
[Link] = [Link](0,100,0,16)
[Link] = 1
[Link] = "Hello, "..[Link]
[Link] = [Link]
[Link] = 14
ht.TextColor3 = [Link](1,1,1)
[Link] = 1

local et = [Link]("TextLabel", greet)


[Link] = "EnjoyText"
[Link] = [Link](0,textX,0,22)
[Link] = [Link](0,100,0,12)
[Link] = 1
[Link] = "Enjoy menu"
[Link] = [Link]
[Link] = 10
et.TextColor3 = [Link](150,150,150)
[Link] = 1

-- появление контента
for _,entry in ipairs({
{obj=avatar, props={ImageTransparency=0}},
{obj=stroke, props={Transparency=0}},
{obj=ht, props={TextTransparency=0}},
{obj=et, props={TextTransparency=0}},
}) do
if [Link] then
TweenService:Create([Link], [Link](CONST.ANIM_T),
[Link]):Play()
end
end

-- === Секции (табы) ===


if not container:FindFirstChild("SectionsContainer") then
local sections = {"Раздел 1","Раздел 2","Раздел 3"}
local secCont = [Link]("Frame", container)
[Link] = "SectionsContainer"
[Link] = [Link](0,0)
[Link] = [Link](0,12,0,80)
[Link] = [Link](0,150,0,#sections*28 + (#sections-
1)*4)
[Link] = 1
[Link] = true

local listLayout = [Link]("UIListLayout", secCont)


[Link] = [Link]
[Link] = [Link](0,4)

local tweenFast = [Link](0.15, [Link],


[Link])
local btns = {}

for i,name in ipairs(sections) do


local btn = [Link]("TextButton", secCont)
[Link] = "Tab"..i
[Link] = i
[Link] = [Link](1,0,0,24)
btn.BackgroundColor3 = [Link](40,40,40)
[Link] = 1
[Link] = 0
[Link] = false
[Link] = name
[Link] = [Link]
[Link] = 11
btn.TextColor3 = [Link](230,230,230)
[Link] = 1
[Link]("UICorner", btn).CornerRadius = [Link](0,4)
[Link](btns, btn)

delay(0.05 * i, function()
TweenService:Create(btn, tweenFast, {
BackgroundTransparency = 0,
TextTransparency = 0,
}):Play()
end)
btn.MouseButton1Click:Connect(function()
for _,b in ipairs(btns) do
local props = (b == btn)
and {Size = [Link](1,0,0,28), BackgroundColor3 =
[Link](70,70,70)}
or {Size = [Link](1,0,0,20), BackgroundColor3 =
[Link](40,40,40)}
TweenService:Create(b, tweenFast, props):Play()
end
[Link] = i
end)
end

-- выделить последний или первый


delay(0.1, function()
local idx = [Link] or 1
local btn = secCont:FindFirstChild("Tab"..idx)
if btn then
for _,b in ipairs(btns) do
local props = (b == btn)
and {Size = [Link](1,0,0,28), BackgroundColor3 =
[Link](70,70,70)}
or {Size = [Link](1,0,0,20), BackgroundColor3 =
[Link](40,40,40)}
TweenService:Create(b, tweenFast, props):Play()
end
end
end)
end

-- ====== Buttons Minimize / Close ======


local function makeBtn(name, sym, xOffset, fn)
local b = [Link]("TextButton", container)
[Link] = name
[Link] = [Link](1, 0)
[Link] = [Link](1, xOffset, 0, 10)
[Link] = [Link](0,30,0,30)
[Link] = 1
[Link], [Link], [Link], [Link] = sym,
[Link], 20, 1
[Link] = false
[Link]("UICorner", b).CornerRadius = [Link](1,0)
local s = [Link]("UIStroke", b)
[Link], [Link], [Link] = [Link](150,150,150), 1, 2
b.MouseButton1Click:Connect(fn)
return b
end

[Link] = makeBtn("MinimizeBtn", "–", -50, minimizeMenu)


[Link] = makeBtn("CloseBtn", "×", -15, closeAll)
for _,btn in ipairs({[Link], [Link]}) do
TweenService:Create(btn,
[Link](CONST.ANIM_T*0.6,[Link]), {
TextTransparency = 0
}):Play()
local s = btn:FindFirstChildOfClass("UIStroke")
if s then TweenService:Create(s, [Link](CONST.ANIM_T*0.6),
{Transparency=0}):Play() end
end

[Link], [Link], [Link] = true, false, false


end)
end

-- ====== 10. MINИМИЗИРОВАТЬ ======


function minimizeMenu()
[Link], [Link] = true, false

local g = container:FindFirstChild("AvatarGreeting")
if g then [Link] = false end

local oldSections = container:FindFirstChild("SectionsContainer")


if oldSections then oldSections:Destroy() end

for _,b in ipairs({[Link], [Link]}) do


local s = b:FindFirstChildOfClass("UIStroke")
TweenService:Create(b, [Link](CONST.ANIM_T*0.5),
{TextTransparency=1}):Play()
if s then TweenService:Create(s, [Link](CONST.ANIM_T*0.5),
{Transparency=1}):Play() end
end

TweenService:Create(camera, [Link](CONST.ANIM_T),
{FieldOfView=[Link]}):Play()
if [Link] then [Link]:Destroy() end
if [Link] then [Link]:Destroy() end
TweenService:Create(contStroke, [Link](CONST.ANIM_T),
{Transparency=0.5}):Play()

local t = TweenService:Create(container,
[Link](CONST.ANIM_T, [Link]),
{Size = [Link](CONST.IDLE_SIZE.X,CONST.IDLE_SIZE.Y), Position =
[Link]}
)
t:Play()
[Link]:Connect(function()
[Link]:Destroy()
[Link]:Destroy()
[Link] = CONST.IDLE_SIZE
[Link] = CONST.IDLE_SIZE
[Link] = [Link]
[Link] = [Link]
[Link] = [Link]
[Link] = [Link]
[Link] = true
[Link] = false
end)
end

-- ====== 11. CLOSE ======


function closeAll()
[Link], [Link] = true, false

for _,b in ipairs({[Link], [Link]}) do


local s = b:FindFirstChildOfClass("UIStroke")
TweenService:Create(b, [Link](CONST.ANIM_T*0.5),
{TextTransparency=1}):Play()
if s then TweenService:Create(s, [Link](CONST.ANIM_T*0.5),
{Transparency=1}):Play() end
end

TweenService:Create(camera, [Link](CONST.ANIM_T),
{FieldOfView=[Link]}):Play()
if [Link] then TweenService:Create([Link],
[Link](CONST.ANIM_T), {BackgroundTransparency=1}):Play() end
if [Link] then TweenService:Create([Link],
[Link](CONST.ANIM_T), {Size=0}):Play() end
TweenService:Create(contStroke, [Link](CONST.ANIM_T),
{Transparency=1}):Play()

local t = TweenService:Create(container,
[Link](CONST.ANIM_T, [Link], [Link]),
{Size=[Link](0,0,0,0), Position=[Link](0.5,0,0.5,0),
BackgroundTransparency=1}
)
t:Play()
[Link]:Connect(function()
screenGui:Destroy()
end)
end

You might also like