I am making a dialog typewriter system, and a feature I wanted to add was that it automatically calculated whether or not if the text was out of bounds. If so, it would wait for the mouse’s input, clear all the text, and write the remaining text down.
However, I can’t seem to correctly calculate whether or not the text is out of bounds.
Here is a video:
Notice how the rest of the A’s go out of the TextLabel? If my system worked correctly, it would have detected it went out of the TextLabel beforehand, and waited for user input.
Here is my code:
return function(toad) local Players = game:GetService("Players") local TextService = game:GetService("TextService") local Dialog = toad.Class("Dialog") local Maid = toad.Maid function Dialog:__init() local _Maid = Maid.new() self.MouseEvent = game:GetService("Players").LocalPlayer:GetMouse().Button1Down self.GUI = script:FindFirstChild("Dialog"):Clone() self.GUI.Parent = toad.PlayerGui local Shadow = toad.RoStrap:LoadLibrary("PseudoInstance").new("Shadow") Shadow.Elevation = 8 Shadow.Parent = self.GUI.Back local label:TextLabel = toad.PlayerGui:WaitForChild("Dialog").Back.Text self.label = label local Params = Instance.new("GetTextBoundsParams") self.Params = Params self.Params.Text = label.Text self.Params.Font = label.FontFace self.Params.Size = label.TextSize self.Params.Width = label.AbsoluteSize.X function self.VerifyBounds(label, Text) self.Params.Text = Text self.Params.Font = label.FontFace self.Params.Size = label.TextSize self.Params.Width = label.AbsoluteSize return TextService:GetTextBoundsAsync(self.Params) end self._Maid = _Maid _Maid:GiveTask( label:GetPropertyChangedSignal("MaxVisibleGraphemes"):Connect(function() self.Params.Text = label.Text end) ) label.MaxVisibleGraphemes = 0 label.Text = "" end function Dialog:say(Text) local GUI = self.GUI local _Maid = self._Maid local TextLabel : TextLabel = self.label local function removeTags(str) str = str:gsub("<br%s*/>", "\n") return (str:gsub("<[^<>]->", "")) end local Text = removeTags(Text) TextLabel.Text = Text for i, v in utf8.graphemes(Text) do local grapheme = Text:sub(i, v) local falseLapse = Text:sub(1, i + 1) print(falseLapse) local remaining = Text:gsub(Text:sub(1, i), "") local lapse = Text:sub(1, i) local bounds = self.VerifyBounds(TextLabel, falseLapse) TextLabel.MaxVisibleGraphemes = i if bounds.Y > TextLabel.AbsoluteSize.Y then self.MouseEvent:Wait() TextLabel.Text = "" Dialog.say(self, remaining) else wait(.05) end end end return Dialog end