Controlling love.draw updates (another problem: canvases)

Questions about the LÖVE API, installing LÖVE and other support related questions go here.
Forum rules
Before you make a thread asking for help, read this.
Post Reply
Jepcats
Prole
Posts: 8
Joined: Thu Sep 18, 2014 3:19 pm

Controlling love.draw updates (another problem: canvases)

Post by Jepcats »

Hi guys, my problem is that I'm trying to update only the pixels on the screen that need updating, and I can't get it to work.

I'm not really making a game, so that's why it's a bit unusual. If I loop over every single pixel and redraw every single one of them and if I have a window of say size 500x500 then that's 250,000 individual pixel updates. It can't seem to quite handle that :ultraglee:

So what I've tried at the moment is keeping a table of the pixels that need to be updated and what they need to be updated to, and then only drawing those pixels in the draw method. I seem to remember in SDL (if I did it a certain way, it's been a while so I don't remember) this having the effect of just drawing over the top of what was already there, but LOVE seems to paste a big black rectangle over the top of everything and then I'm just redrawing over the top of that, except I'm not drawing anymore because my code thinks it doesn't need to do any more redraws till something gets updated (which nothing does yet, I haven't implemented that part). I assumed this big black rectangle was the background colour, so I did love.graphics.setBackgroundColor(0, 0, 0, 0) in love.load() but that didn't work.

If something's unclear let me know and I'll clarify, and if you want to see code ask me and I'll PM you or paste it here; it's only 80 lines (which I'd trim a bit anyway).

Help? Thanks in advance.
Last edited by Jepcats on Fri Sep 19, 2014 2:35 pm, edited 1 time in total.
User avatar
rmcode
Party member
Posts: 454
Joined: Tue Jul 15, 2014 12:04 pm
Location: Germany
Contact:

Re: Controlling love.draw updates

Post by rmcode »

Not sure if I understood your problem / question correctly, but you could draw all the things you need to a canvas and then only update the pixels on the canvas that need to be updated. This should give you the effect you need I think.

If you attach a .love file it would be easier to help you ;)

P.S.: If I had to guess, I'd say that you are maybe coding a paint editor? :P
User avatar
DaedalusYoung
Party member
Posts: 413
Joined: Sun Jul 14, 2013 8:04 pm

Re: Controlling love.draw updates

Post by DaedalusYoung »

You can try modifying the love.run function, just leave out the love.graphics.clear call.
User avatar
Robin
The Omniscient
Posts: 6506
Joined: Fri Feb 20, 2009 4:29 pm
Location: The Netherlands
Contact:

Re: Controlling love.draw updates

Post by Robin »

DaedalusYoung wrote:You can try modifying the love.run function, just leave out the love.graphics.clear call.
That doesn't always work well.

A better suggestion would be to draw everything to a [wiki]Canvas[/wiki] and then draw that Canvas to the screen.
Help us help you: attach a .love.
Jepcats
Prole
Posts: 8
Joined: Thu Sep 18, 2014 3:19 pm

Re: Controlling love.draw updates

Post by Jepcats »

Thanks! A canvas was exactly what I needed.

@rmcode Ah, sorry, I'll do that in future if I need help again. Nah it's a cellular automaton, but maybe it'll have some painting features at some point :P
Jepcats
Prole
Posts: 8
Joined: Thu Sep 18, 2014 3:19 pm

Re: Controlling love.draw updates

Post by Jepcats »

I'm writing this in a separate post as it's unrelated to the previous and I would want people that have already read the previous to read this too. Or would it be more right to edit the previous post? Let me know :)

Anyway, I'm having some trouble using canvases. I'm getting a weird flashing effect and I'm not sure why. I've created and attached a minimal .love example to show what I mean (perhaps it won't even flash for you if the problem lies with the computer I'm using).

Edit: You have to wait a few seconds before it starts flashing.
Attachments
Test.love
(556 Bytes) Downloaded 122 times
User avatar
Ref
Party member
Posts: 702
Joined: Wed May 02, 2012 11:05 pm

Re: Controlling love.draw updates (another problem: canvases

Post by Ref »

Ah - common trap.
Try adding love.graphics.setColor(255,255,255) before love.graphics.draw(canvas).

[Suggestion: Really should put non-drawing operations in love.updata and drawing operations in love.draw.]
Jepcats
Prole
Posts: 8
Joined: Thu Sep 18, 2014 3:19 pm

Re: Controlling love.draw updates (another problem: canvases

Post by Jepcats »

Ah interesting. So the last colour set before you draw the canvas acts as a sort of filter. Should have probably guessed but that wasn't obvious to me, would probably be a good small point to mention on the Canvas wiki page.

And ah, I guess drawing to the canvas as opposed to the actual window doesn't come under a drawing operation then? Fair enough, I'll move it.

Thanks a lot :D

EDIT: This is making things I want to look black look grey. How do I draw the canvas without this?
Jepcats
Prole
Posts: 8
Joined: Thu Sep 18, 2014 3:19 pm

Re: Controlling love.draw updates (another problem: canvases

Post by Jepcats »

Well I got it to work, just not in a very nice way:

Code: Select all

love.graphics.setColor(255, 255, 255)
love.graphics.setBlendMode("replace")
love.graphics.draw(canvas)

love.graphics.setBlendMode("alpha")	
drawText("FPS: " .. love.timer.getFPS(), 0, 0)
drawText("Iteration: " .. iteration, 0, windowH - font:getHeight())
love.graphics.setBlendMode("replace")
I still don't fully understand the role of the setColor(white). Replace felt like the right thing to use, and alpha was the default thing being used, so I just sort of intuitively thought drawing the canvas on mode replace then the text stuff on the default mode (it doesn't work otherwise) would work. Not quite, but changing it to replace again after the text worked (which I don't really understand). I don't fully understand what I've done, and if someone could explain it I would appreciate it. Other than that, I think this'll be the last call for help from me in this thread. Thanks guys :)

Edit: Someone coming across this at a later date might notice the first canvas drawn is still a bit weird (at least with the way my code is). I've settled with that and haven't bothered to fix it. If you know a way/better way to do it PM me (if this thread is old).
Post Reply

Who is online

Users browsing this forum: Bing [Bot], Google [Bot] and 7 guests