im trying to make a text rendering script that utilizes individual text labels to apply effects like shaking or wiggling, and i recently rewrote the entire function to merge letters if they dont need to be individual, but im running into an issue where the the labels dont show up and the last label shows up as its typing out but then disappears again, does anybody know why the labels arent showing up?
local cancelTyping = false
function renderText(text:string, typewriter:boolean)
cancelTyping = false
clearText()
--TAGS
local styles = {}
local styleChanged = false
--PARSING
local escapeNext = false
local parsingTag = false
local tagIsClosing = false
local parsedTag = ""
local labelTextToSet = ""
--UI ELEMENTS
local currentWordTEMP = wordTEMP:Clone()
local currentLabelTEMP = currentWordTEMP.LetterTEMP:Clone()
local tickOffset = 0
--TYPEWRITER
local typewriterTypingITV = 0.02
local function setLabelStyle(label)
for _, style in pairs(styles) do
if style.tagName == "rainbow" then
letterSpecialEffects[label] = {
effect = "rainbow",
label = label
}
currentLabelTEMP.Destroying:Connect(function()
letterSpecialEffects[label] = nil
end)
elseif style.tagName == "shaky" then
letterSpecialEffects[label] = {
effect = "shaky",
label = label,
magnitude = style.tagParams.magnitude
}
currentLabelTEMP.Destroying:Connect(function()
letterSpecialEffects[label] = nil
end)
elseif style.tagName == "wiggly" then
letterSpecialEffects[label] = {
effect = "wiggly",
label = label,
magnitude = style.tagParams.magnitude,
speed = style.tagParams.speed,
tickOffset = tickOffset
}
currentLabelTEMP.Destroying:Connect(function()
letterSpecialEffects[label] = nil
end)
elseif style.tagName == "b" then
label.Text = `<b>{label.Text}</b>`
elseif style.tagName == "i" then
label.Text = `<i>{label.Text}</i>`
elseif style.tagName == "u" then
label.Text = `<u>{label.Text}</u>`
elseif style.tagName == "s" then
label.Text = `<s>{label.Text}</s>`
elseif style.tagName == "uc" or style.tagName == "uppercase" then
label.Text = `<uc>{label.Text}</uc>`
elseif style.tagName == "sc" or style.tagName == "smallcaps" then
label.Text = `<uc>{label.Text}</uc>`
elseif style.tagName == "lc" or style.tagName == "lowercase" then
label.Text = string.lower(label.Text) --there is no rich text tag for this :(
elseif style.tagName == "tw" then
label:SetAttribute("TypingITV", tonumber(style.tagParams.itv) or 0.02)
end
end
end
local splitByLetter = string.split(text, "")
for _, letter in pairs(splitByLetter) do
tickOffset += 0.5
--print(styles)
if letter == "\\" and not escapeNext then
escapeNext = true
elseif letter == "[" and not escapeNext and not parsingTag then
parsingTag = true
elseif letter == "/" and parsingTag then
tagIsClosing = true
elseif letter == "]" and not escapeNext and parsingTag then
parsingTag = false
styleChanged = true
if tagIsClosing then
styles[parsedTag] = nil
tagIsClosing = false
else
local style = {
tagName = "",
tagParams = {},
tickOffset = tickOffset
}
--print(parsedTag)
local tagName, parameters = string.match(parsedTag, '^(%w+)%s*(.*)$')
style.tagName = tagName
if parameters then
for name, data in string.gmatch(parameters, '(%w+)%s*=%s*"(.-)"') do
print(name, data)
style.tagParams[name] = data
end
end
styles[tagName] = style
end
parsedTag = ""
elseif parsingTag then
parsedTag ..= letter
elseif letter == " " and not parsingTag then
--set word parent, visible and make new word and label
currentWordTEMP.LetterTEMP:Destroy()
currentWordTEMP = wordTEMP:Clone()
currentWordTEMP.Name = "hi"
currentWordTEMP.Parent = textFrame
currentWordTEMP.Visible = true
currentWordTEMP = wordTEMP:Clone()
currentLabelTEMP = currentWordTEMP.LetterTEMP:Clone()
--set label text n stuff
currentLabelTEMP.Name = "label"
currentLabelTEMP.Text = labelTextToSet
currentLabelTEMP.Parent = currentWordTEMP
currentLabelTEMP.Visible = true
setLabelStyle(currentLabelTEMP)
typewriterTypingITV = currentLabelTEMP:GetAttribute("TypingITV")
if typewriter then
for i=1, string.len(currentLabelTEMP.ContentText) do
if cancelTyping then break end
if currentLabelTEMP.Parent ~= currentWordTEMP then currentLabelTEMP.Parent = currentWordTEMP end
currentLabelTEMP.Visible = true
currentLabelTEMP.MaxVisibleGraphemes = i
print(currentLabelTEMP.Parent)
print("looping", currentLabelTEMP.Visible, currentLabelTEMP.MaxVisibleGraphemes)
wait(typewriterTypingITV)
end
end
labelTextToSet = ""
else
if styles["rainbow"] or styles["wiggly"] or styles["shaky"] or styleChanged then
styleChanged = false
currentLabelTEMP.Text = labelTextToSet
currentLabelTEMP.Name = "label"
currentLabelTEMP.Parent = currentWordTEMP
setLabelStyle(currentLabelTEMP)
typewriterTypingITV = currentLabelTEMP:GetAttribute("TypingITV")
if typewriter then
for i=1, string.len(currentLabelTEMP.ContentText) do
if cancelTyping then break end
if currentLabelTEMP.Parent ~= currentWordTEMP then currentLabelTEMP.Parent = currentWordTEMP end
currentLabelTEMP.Visible = true
currentLabelTEMP.MaxVisibleGraphemes = i
print(currentLabelTEMP.Parent)
print("looping", currentLabelTEMP.Visible, currentLabelTEMP.MaxVisibleGraphemes)
wait(typewriterTypingITV)
end
end
labelTextToSet = ""
currentLabelTEMP = wordTEMP.LetterTEMP:Clone()
end
labelTextToSet ..= letter
end
if cancelTyping then break end
--wait(0.01)
end
--last label and word
currentWordTEMP.LetterTEMP:Destroy()
currentWordTEMP = wordTEMP:Clone()
currentWordTEMP.Name = "hi"
currentWordTEMP.Parent = textFrame
currentWordTEMP.Visible = true
currentLabelTEMP = currentWordTEMP.LetterTEMP:Clone()
currentLabelTEMP.Text = labelTextToSet
currentLabelTEMP.Name = labelTextToSet
currentLabelTEMP.Parent = currentWordTEMP
setLabelStyle(currentLabelTEMP)
typewriterTypingITV = currentLabelTEMP:GetAttribute("TypingITV")
if typewriter then
for i=1, string.len(currentLabelTEMP.ContentText) do
if cancelTyping then break end
if currentLabelTEMP.Parent ~= currentWordTEMP then currentLabelTEMP.Parent = currentWordTEMP end
currentLabelTEMP.Visible = true
currentLabelTEMP.MaxVisibleGraphemes = i
print("looping LAST WORD", currentLabelTEMP.Visible, currentLabelTEMP.MaxVisibleGraphemes, currentLabelTEMP.Parent, currentLabelTEMP.Parent.Parent)
wait(typewriterTypingITV)
end
end
print("erm")
end