Prezados amigos do Fórum,
Desculpe-me se a questão for demasiadamente simples, mas estou com dificuldades em aplicar um recurso que estou desenvolvendo em NCLua.
Teria como por exemplo um texto exibido na tela pela função drawText obedecer alguns limitadores de espaços, formatando uma espécie de caixa de texto, onde faria automaticamente a quebra de linhas quando esta se completaria?
Alguém por gentileza poderia expor suas soluções, caso já enfrentou este tipo de problema?
Obrigado pela atenção.
Autor: Alysson Carvalho
55 comentários
Se a linha cabe na caixa, imprime a linha.
Senao, acha o maior prefixo que caiba e chama a funcao recursivamente,
para o prefixo e para o restante da linha. O seguinte codigo, dump.lua, usa esse algoritmo para imprimir o conteudo do
arquivo `file.txt' na regiao do NCLua. Note que, para achar o prefixo otimo,
a funcao `output' varre todos os prefixos da linha. Uma forma de melhorar isso
eh usar busca binaria. -- dump.lua
canvas:attrColor ('white')
canvas:attrFont ('vera', 18) local screen_w, screen_h = canvas:attrSize ()
local offset = 0
function output (line)
if offset > screen_h then return end
local line_w, line_h = canvas:measureText (line)
if line_w ):lines () do
output (line)
end
de caracteres que cabem por linha, pegando uma string
e gerando uma tabela lua onde, cada item contém
uma parte da string que se encaixa na largura
da área que vc tem.
O código se preocupa em não quebrar palavras no meio.
A partir da tabela gerada você define
o que fará, podendo fazer um for e usar o canvas
para exibir isso. Pode também, a partir do total de linhas da tabela,
calcular quantas linhas cabem verticalmente na área
e implementar um recurso de paginação.
Não tenho um exemplo completo e pronto.
O que tenho está assim, meio solto. Veja a função breakString do módulo em https://gist.github.com/manoelcampos/5645864. Ela recebe uma string, vc especifica o máximo de caracteres que a mesma deve ter, e ela retorna uma tabela (vetor) onde cada item será uma linha da string. Usando o código abaixo vc descobre a largura de uma caractere qualquer. Assim, usei o W pois é um caractere largo, assim, se tenho uma largura X e divido pela largura do W (a largura é considerada para o estilo e tamanho de fonte atual), saberei quantos caracteres caberão no máximo na região definida: --largura e algura do canvas (região do lua) local w, h = canvas:attrSize() --largura e altura de um caractere qualquer (pode trocar o --caractere para tentar ajustar melhor) local tw, th = canvas:measureText("W") --descubro quantos caracteres caberá na região --(pode subtrair um valor desejado para definir bordas. --substraia valores até ajustar como deseja) local totalCharPorLinha = (w / tw) Agora é só chamar a função: linhas = util.breakString(texto, totalCharPorLinha) --imprimi as linhas depois de quebrar for i, linha in ipairs(linhas) do print(linha) --poderia usar canvas aqui para imprimir cada linha end Para saber quantas linhas vai caber na área, e assim descobrir quantas páginas terá, usará fórmula semelhante a que mostrei acima (os valores de altura e largura do canvas e de um caractere já tem em w, h, tw, th ).