Page 1 of 3

Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 4:20 pm
by RogerH
Hi all,

I am a noob at this. I have done some programming in Basic, SIOC and other languages so I have a rough idea of what I'm doing, but new to lua and LOVE.

I have a file with two lines in it - eg:

Hello
----------world!

(where "world!" has 10 spaces in front of it, not dashes, but when I previewed the post it deleted the spaces in my example))

I want to see

Hello world!

I have tried reading the lines one at a time and drawing them in the same place


local file = assert(io.open("path",helloWorld.txt"))
for x=1,2 ,1
do
local line = file:read()

function love.draw()
love.graphics.setNewFont(36)
love.graphics.print (line, 50, 50)
end
end

but the second print overwrites the first.

I have played with the alpha channel of the text and the background but i still just get

----------world!

(again, the dashes in the line abover are not in the actual file - they are spaces in the file, but the system here deleted the spaces from my example)

Any suggestions? I guess I'm doing something wrong or trying to do something not possible but hey that's the fun of learning!

Thanks in advance :-)

Roger.

Re: Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 5:30 pm
by Bunnybacon
love clears the main canvas on every draw call. I don't know how to disable this, but you can circumvent it by making a new canvas, like this:

Code: Select all

local file = assert(io.open("text.txt"))
local canvas = love.graphics.newCanvas(300,300)

for x=1,2 ,1 do
	local line = file:read()
	canvas:renderTo(function()
		love.graphics.setNewFont(36)
		love.graphics.print(line, 50, 50)
	end)
	function love.draw()
		love.graphics.draw(canvas,0,0)
	end
end

Re: Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 6:03 pm
by RogerH
Hi,

Thanks so much for the help!

It made a difference in that the two lines now both show, but they are superimposed.

The second line has spaces at the beginning, which should mean (if they were printed) that it would show 'Hello world!'

But what I'm getting is 'Hello' and 'world!' printed on top of each other.

progress, though, and I'm grateful for the help.

I'm guessing they are on totally separate canvasses which are then superimposed on each other?

Thanks,

Roger.

Re: Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 6:17 pm
by RogerH
So I changed it to:

local canvas = love.graphics.newCanvas()

local line = file:read()
canvas:renderTo(function()
love.graphics.setNewFont(36)
love.graphics.print(line, 50, 50)
end)
local line = file:read()
canvas:renderTo(function()
love.graphics.setNewFont(36)
love.graphics.print(line, 150, 50)
end)
function love.draw()
love.graphics.draw(canvas,0,0)
end

And with a bit of tinkering I can get it to work (I only have about 12 lines to deal with)

As an aside, I'm getting a square character at the end of each line - any idea why?

many thanks,

Roger.

Re: Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 6:48 pm
by grump
Please use code tags.

You're getting square characters at the end of each line because your file has Windows style line endings (<CR><LF>); file:read() looks for Unix style line endings (<LF>) and ignores <CR>.

This results in lines that end in <CR>. The active font displays that (unprintable) character as a box.

You can either change the line endings in a text editor, or remove the <CR> character from the strings:

Code: Select all

local line = file:read():gsub("\r", "")

Re: Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 8:17 pm
by zorg
RogerH wrote: Sun Sep 03, 2017 6:03 pm
The second line has spaces at the beginning, which should mean (if they were printed) that it would show 'Hello world!'
But what I'm getting is 'Hello' and 'world!' printed on top of each other.

I'm guessing they are on totally separate canvasses which are then superimposed on each other?
If i recall correctly, Löve removes those extra spaces from the beginning of lines to be printed, maybe that's why; you need to offset it yourself.

Re: Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 9:03 pm
by RogerH
Thanks so much for the help both of you - off to bed now as I have an early start but will get back to you with results tomorrow. Cgheers,

Roger.

Re: Complete Noob - Drawing text in layers

Posted: Sun Sep 03, 2017 9:04 pm
by RogerH
All three of you, sorry!

Re: Complete Noob - Drawing text in layers

Posted: Tue Sep 05, 2017 7:04 am
by RogerH
Hi Guys,

Getting some success now. The code to get rid of the squares worked, and the code to draw separate canvasses worked too!

I figured a workaround for the superimposed graphics by using 'printf':

Code: Select all

--Read first 12 chars
	local line = file:read(12):gsub("\r", "")
	canvas:renderTo(function()
		love.graphics.setNewFont(32)
		love.graphics.printf(line, 40, 38, 800,"left")
	end)
	
--Read second 12 chars (plus line feeds = 14)
	local line = file:read(14):gsub("\r", "")
	canvas:renderTo(function()
		love.graphics.setNewFont(32)
		love.graphics.printf(line, 20, 38, 780,"right")
	end)
I was then able to justify left and right and get "Hello--------------world!" (again, dashes represent spaces in the example)

What I'm finding in this is that spaces are an issue - they seem to get stripped from the file as it's printed - at least, more than one space is - if there's a space between two words like " Hello lovely--------world!" then that space gets printed. But at the moment it sems multiple spaces get stripped. This is a bit of an problem as they are part of the formatting of the final presentation.

Is there a way of reading the lines of the file by character, rather than lines?

Would this be a way of reading the file character by character?

Code: Select all

local line = file:read(1):gsub("\r", "")
If the "file:read" comes to a space, how would I force it to print a space to the final screen?

many thanks again,

Roger.

Re: Complete Noob - Drawing text in layers

Posted: Tue Sep 05, 2017 8:52 am
by zorg
As i said before, reading it all it one go is not the issue; your issue is that yes, love.graphics.print and printf does strip extra spaces.
Can't do anything about that, but you can use the font functions to get the width of the previous n characters, and calculate the offsets that way... although i'm sure there's an easier way to what you want to accomplish... probably.