Pesquisa resultou em 5 ocorrências

por Fabio
13 Jan 2019, 22:48
Fórum: Utilidades
Tópico: Lua, Texto com formatação na tela
Respostas: 9
Exibições: 675
Gênero:

Re: Lua, Texto com formatação na tela

Um_Geek escreveu:
13 Jan 2019, 22:44
Fabio escreveu:
13 Jan 2019, 15:37
Só uma observação é que pelo método que postei e esqueci de dizer: se usar um valor acima de 255 em alguma cor, vai dar errado o resultado.

Pode usar bitwise.and(x, 0xFF) para ter certeza que irá até 255. (Confira a sintaxe no site oficial de Lua)
talvez não precisa, até porque usar mais que 255 para cor rgb não é comum, eu acho...

O limite é 255 mesmo, seria apenas para uma "proteção contra bugs", mas não é algo obrigatório nesse caso.
por Fabio
13 Jan 2019, 15:37
Fórum: Utilidades
Tópico: Lua, Texto com formatação na tela
Respostas: 9
Exibições: 675
Gênero:

Re: Lua, Texto com formatação na tela

Um_Geek escreveu:
13 Jan 2019, 14:43
Fabio escreveu:
13 Jan 2019, 02:27
Falo do ponto de vista da quantidade de instruções necessárias que o processador precisa.

foi o que entendi, onde tinha um tradutor(que trabalhava 2 vezes) e um matemático, desta forma só usa o matemático.

Bom, na verdade, eu que li errado a sua resposta. :philo:


Só uma observação é que pelo método que postei e esqueci de dizer: se usar um valor acima de 255 em alguma cor, vai dar errado o resultado.

Pode usar bitwise.and(x, 0xFF) para ter certeza que irá até 255. (Confira a sintaxe no site oficial de Lua)
por Fabio
13 Jan 2019, 02:27
Fórum: Utilidades
Tópico: Lua, Texto com formatação na tela
Respostas: 9
Exibições: 675
Gênero:

Re: Lua, Texto com formatação na tela

Um_Geek escreveu:
12 Jan 2019, 23:14
Fabio escreveu:
12 Jan 2019, 22:23
Mas se usasse um cálculo matemático/binário seria mais rápido do ponto de vista do processador.

De seu modo ficou assim

Código: Selecionar tudo

local global_fonts = {}
local function display_text_by_font(text,font,size,x,y,bold,border,shadow,r,g,b,a)
	local flags = 0x0
	local color = 0xFFFFFFFF
	if bold then flags = flags + 0x1 end 
	if border then flags = flags + 0x4 end 
	if shadow then shadow = flags + 0x8 end 
	if r and g and b and a then
		a = a * 0x01000000
		r = r * 0x00010000
		g = g * 0x00000100
		b = b * 0x00000001
		color = a + r + g + b
	end
	if global_fonts[font..size] == nil then 
		global_fonts[font..size] = renderCreateFont(font,size,flags)
	end
	renderFontDrawText(global_fonts[font..size],text,x,y,color)
end

Parece ser mais direto que usando o string.format mesmo.

SpoilerAbrir

Código: Selecionar tudo


local global_fonts = {}
local function display_text_by_font(text,font,size,x,y,bold,border,shadow,r,g,b,a)
	local flags = 0x0
	local color = 0xFFFFFFFF
	if bold then flags = flags + 0x1 end 
	if border then flags = flags + 0x4 end 
	if shadow then shadow = flags + 0x8 end 
	if r and g and b and a then
		a = a * 0x01000000
		r = r * 0x00010000
		g = g * 0x00000100
		b = b * 0x00000001
		color = a + r + g + b
	end
	if global_fonts[font..size] == nil then 
		global_fonts[font..size] = renderCreateFont(font,size,flags)
	end
	renderFontDrawText(global_fonts[font..size],text,x,y,color)
end

function main()
    while true do 
        local x, y = 90, 90
        for i,color in ipairs({
            {r=255,g=0,b=0,a=255,name="VERMELHO"},
            {r=0,g=255,b=0,a=255,name="VERDE"},        
            {r=0,g=0,b=255,a=255,name="AZUL"},
            {r=0,g=0,b=0,a=255,name="PRETO"},   
            {r=255,g=255,b=255,a=255,name="BRANCO"},
            {r=255,g=255,b=0,a=255,name="AMARELO"},  
            {r=255,g=175,b=0,a=255,name="LARANJA"},                 
        }) do

            display_text_by_font(color.name,'verdana',14,x,y,true,true,false,color.r,color.g,color.b,color.a)
            y = y + 45

        end
        wait(0)
    end
end

Falo do ponto de vista da quantidade de instruções necessárias que o processador precisa executar para fazer a tarefa, não do ponto de vista da quantidade de linhas.

Com string.format é preciso ler a string de formato (vai um loop, um switch e mais algumas coisas), converter cada inteiro de cor para string (outro loop interno, um buffer, etc.), depois escrever no buffer e converter esse hex em string para inteiro novamente.
por Fabio
12 Jan 2019, 22:23
Fórum: Utilidades
Tópico: Lua, Texto com formatação na tela
Respostas: 9
Exibições: 675
Gênero:

Re: Lua, Texto com formatação na tela

Um_Geek escreveu:
12 Jan 2019, 21:17
Eu espiei as conversões de string.format e cheguei a isto, não sei se da 100% de precisão na cor.

Código: Selecionar tudo

function rgb_to_hex(R,G,B,A)
return string.format("0x%02x%02x%02x%02x",A,R,G,B)
end

Me parece ok, deve dar 100%.

Mas se usasse um cálculo matemático/binário seria mais rápido do ponto de vista do processador.
Acredito que dê para fazer multiplicando também, não é obrigatório ser por bitwise, ou usando cópia para array.
Algo como:

Código: Selecionar tudo


a = a * 0x01000000
r = r * 0x00010000
g = g * 0x00000100
b = b * 0x00000001 // vai ser a mesma coisa, mas só colocando por estética

return a + r + g + b

por Fabio
12 Jan 2019, 16:17
Fórum: Utilidades
Tópico: Lua, Texto com formatação na tela
Respostas: 9
Exibições: 675
Gênero:

Re: Lua, Texto com formatação na tela

Muito bom!

Mas pode converter RGBA para hex 32 bits usando bitwise (usando Shift bits e o operador OR), não precisa converter para string.

Em C++ é mais fácil converter pois é só fazer um vetor/array de 4 índices de uint8_t, converter para ponteiro de uint32_t e ler o valor.

Voltar para “Lua, Texto com formatação na tela”