|
|
| Line 15: |
Line 15: |
| | textfield:setPosition(8, 16) | | textfield:setPosition(8, 16) |
| | stage:addChild(textfield) | | stage:addChild(textfield) |
| − | </syntaxhighlight > | + | </syntaxhighlight> |
| | + | |
| | + | === Text Wrap2 @ar2rsawseen === |
| | + | Please follow this link: '''[[Text Wrap2 @ar2rsawseen]]''' |
| | | | |
| | === TextBox @antix === | | === TextBox @antix === |
| | [[File:Textbox.png|128px]] | | [[File:Textbox.png|128px]] |
| − | <syntaxhighlight lang="lua">
| |
| − | -- @antix
| |
| − | TextBox = Core.class(Sprite)
| |
| − |
| |
| − | function TextBox:init(options)
| |
| − | -- default options
| |
| − | local props = {
| |
| − | x = 0,
| |
| − | y = 0,
| |
| − | width = 256, -- constrain width of TextBox to this
| |
| − | linePadding = 3, -- pixel gap between text lines
| |
| − | color = 0xe0e0e0, -- default text color
| |
| − | font = Font:getDefault(),
| |
| − | text = "",
| |
| − | }
| |
| − |
| |
| − | -- overwrite default options
| |
| − | if options then
| |
| − | for key, value in pairs(options) do
| |
| − | props[key]= value
| |
| − | end
| |
| − | end
| |
| − | self.props = props
| |
| − |
| |
| − | -- we only need one actual TextField that we will reuse to render our TextBox
| |
| − | local brush = TextField.new(props.font, "")
| |
| − | self.brush = brush
| |
| − | self:redraw()
| |
| − | end
| |
| − |
| |
| − | -- set new text and redraw
| |
| − | function TextBox:setText(text)
| |
| − | local props = self.props
| |
| − | props.text = text
| |
| − | self:redraw()
| |
| − | end
| |
| − |
| |
| − | -- set new font and redraw
| |
| − | function TextBox:setFont(font)
| |
| − | local props = self.props
| |
| − | props.font = font
| |
| − | self:redraw()
| |
| − | end
| |
| − |
| |
| − | -- redraw the textbox
| |
| − | function TextBox:redraw()
| |
| − | local props = self.props
| |
| − | local font = props.font
| |
| − |
| |
| − | -- discard any previous imagery
| |
| − | if self:getNumChildren() > 0 then
| |
| − | self:removeChildAt(1)
| |
| − | end
| |
| − |
| |
| − | -- calculate various offsets
| |
| − | local lineHeight = font:getLineHeight()
| |
| − | local actualHeight = lineHeight + props.linePadding
| |
| − | self.lineHeight = lineHeight
| |
| − | self.actualHeight = actualHeight
| |
| − |
| |
| − | -- split and format text
| |
| − | local lines = self:splitText(props.text, font, props.width)
| |
| − | self.lines = lines
| |
| − |
| |
| − | -- create a blank canvas where we will render our text
| |
| − | local canvas = RenderTarget.new(props.width, (#lines + 1) * actualHeight)
| |
| − | self.canvas = canvas
| |
| − |
| |
| − | local brush = self.brush
| |
| − | -- render text to canvas
| |
| − | for i = 1, #lines do
| |
| − | local line = lines[i]
| |
| − | local words = line.words
| |
| − | for w = 1, #words do
| |
| − | local word = words[w]
| |
| − | brush:setText(word.word)
| |
| − | brush:setTextColor(word.color)
| |
| − | brush:setPosition(word.x + line.x, i * actualHeight)
| |
| − | canvas:draw(brush)
| |
| − | --print(string.format("word=%s, x=%d, 0x%06x", word.word, word.x, word.color))
| |
| − | end
| |
| − | end
| |
| − |
| |
| − | -- create bitmap to display
| |
| − | local bitmap = Bitmap.new(canvas) -- our canvas is the texture)
| |
| − | bitmap:setPosition(props.x, props.y)
| |
| − |
| |
| − | self:addChild(bitmap)
| |
| − | end
| |
| − |
| |
| − | -- recolor a single matching string text or all matching text if "all = true"
| |
| − | function TextBox:recolor(text, color, all)
| |
| − | local brush = self.brush
| |
| − | local canvas = self.canvas
| |
| − |
| |
| − | local lineHeight = self.lineHeight
| |
| − | local actualHeight = self.actualHeight
| |
| − |
| |
| − | local lines = self.lines
| |
| − | for i = 1, #lines do
| |
| − | local line = lines[i]
| |
| − | local words = line.words
| |
| − | for j = 1, #words do
| |
| − | local word = words[j]
| |
| − | if word.word == text then
| |
| − | canvas:clear(0x000000, 0, word.x + line.x, i * actualHeight - lineHeight, word.width, actualHeight) -- clear area where word was
| |
| − | word.color = color
| |
| − | brush:setText(word.word)
| |
| − | brush:setTextColor(color)
| |
| − | brush:setPosition(word.x + line.x, i * actualHeight)
| |
| − | canvas:draw(brush) -- draw word
| |
| − | if not all then
| |
| − | return
| |
| − | end
| |
| − | end
| |
| − | end
| |
| − | end
| |
| − | end
| |
| − |
| |
| − | -- this does the heavy lifting, splitting and formatting text lines and words
| |
| − | function TextBox:splitText(text, font, maxWidth)
| |
| − | local props = self.props
| |
| − |
| |
| − | local spaceWidth = font:getAdvanceX(" ")
| |
| − |
| |
| − | local words = {}
| |
| − | local lines = {}
| |
| − | local wordList = {}
| |
| − |
| |
| − | -- split text into words (space separated)
| |
| − | local smatch = string.gmatch
| |
| − | local pattern = '([^ ]+)'
| |
| − | for str in smatch(text, pattern) do
| |
| − | words[#words + 1] = str
| |
| − | end
| |
| − |
| |
| − | local i = 1 -- which word we are currently processing
| |
| − | local x = 0 -- the x offset for any line of text
| |
| − | local lineWidth = 0 -- total width of text in pixels
| |
| − | local color = props.color -- initial color
| |
| − | local align = "left" -- current alignment
| |
| − | local line = ""
| |
| − |
| |
| − | local function newLine()
| |
| − | -- calculate offset for aligned text
| |
| − | if align == "left" then
| |
| − | x = 0
| |
| − | elseif align == "right" then
| |
| − | x = maxWidth - lineWidth
| |
| − | elseif align == "center" then
| |
| − | x = (maxWidth * 0.5) - (lineWidth * 0.5)
| |
| − | end
| |
| − |
| |
| − | lines[#lines + 1] = {
| |
| − | color = color,
| |
| − | text = line,
| |
| − | align = align,
| |
| − | width = font:getAdvanceX(line),
| |
| − | words = wordList,
| |
| − | x = x,
| |
| − | }
| |
| − |
| |
| − | lineWidth = 0
| |
| − | line = ""
| |
| − | wordList = {}
| |
| − | i = i + 1
| |
| − | end
| |
| − |
| |
| − | local done = false
| |
| − | repeat
| |
| − | local word = words[i]
| |
| | | | |
| − | if word == "#n#" then
| + | Please follow this link: '''[[TextBox @antix]]''' |
| − | -- process line feed
| |
| − | newLine()
| |
| − | elseif word == "#color#" then
| |
| − | -- process text color change
| |
| − | color = tonumber(words[i + 1])
| |
| − | i = i + 2
| |
| − | elseif word == "#align#" then
| |
| − | -- process text alignment
| |
| − | align = words[i + 1]
| |
| − | i = i + 2
| |
| − | else
| |
| − | -- process a normal word
| |
| − | local wordWidth = font:getAdvanceX(word)
| |
| − | | |
| − | local w = {
| |
| − | word = word,
| |
| − | width = wordWidth,
| |
| − | x = lineWidth,
| |
| − | color = color,
| |
| − | }
| |
| − | | |
| − | if lineWidth + wordWidth + spaceWidth >= maxWidth then
| |
| − | -- container width exceeded, create a new line but skip back one word because it needs to appear on the next line
| |
| − | i = i - 1
| |
| − | newLine()
| |
| − | else
| |
| − | -- process word normally
| |
| − | wordList[#wordList + 1] = w
| |
| − | line = line .. " " .. word
| |
| − | lineWidth = lineWidth + wordWidth + spaceWidth
| |
| − | i = i + 1
| |
| − | end
| |
| − | end
| |
| − | | |
| − | if i > #words then
| |
| − | -- all words processed, append the last line and set exit condition
| |
| − | newLine()
| |
| − | done = true
| |
| − | end
| |
| − | until done
| |
| − | | |
| − | return lines
| |
| − | end
| |
| − | | |
| − | --[[
| |
| − | -- USAGE
| |
| − | local textBox = TextBox.new(
| |
| − | {
| |
| − | text = "This is a TextBox. It contains text that is automatically split into multiple lines"..
| |
| − | " and of course every #color# 0x0066ff word #color# 0x33ff55 can #color# 0x33ffff be"..
| |
| − | " #color# 0xff66ff individually #color# 0x00ff00 colored."..
| |
| − | " #color# 0xffffff Then there are line breaks which make life..."..
| |
| − | " #n# #n# so much easier!!!"..
| |
| − | " #n# #n# #color# 0xf00000 #align# right Lets align the text to the right #n#"..
| |
| − | " It looks pretty good this way #n# #n# #align# center #color# 0x4080d0 but centered text #n# is always good"..
| |
| − | " also #n# #n# #color# 0xf0f0f0 #align# left Well that's a wrap :)",
| |
| − | }
| |
| − | )
| |
| − | stage:addChild(textBox)
| |
| − | -- recolor all occurences of "is" to the color magenta
| |
| − | textBox:recolor("is", 0xff00ff, true)
| |
| − | -- recolor the first occurence of "the" to the color cyan
| |
| − | textBox:recolor("the", 0x00ffff)
| |
| − | ]] | |
| − | </syntaxhighlight >
| |
| | | | |
| | === Typewriter Style @koeosstudio === | | === Typewriter Style @koeosstudio === |
| Line 312: |
Line 79: |
| | -- Print | | -- Print |
| | myconsole:tWrite(s) | | myconsole:tWrite(s) |
| − | </syntaxhighlight > | + | </syntaxhighlight> |
| | + | |
| | + | {{GIDEROS IMPORTANT LINKS}} |