Page 1 of 2

Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 4:09 am
by czarmurphy
So I'm having this strange problem with setColor() and my print() statements not seeming to take effect after the first set. Take a look at this and hopefully you'll be able to point out my error:

Code: Select all

elseif gameOver then
          love.graphics.setColor(255, 255, 255)
          love.graphics.rectangle('fill', 0, 0, love.graphics.getWidth(), love.graphics.getHeight())
          
          love.graphics.setColorMode('modulate')
          love.graphics.setColor(0, 0, 0)
          love.graphics.print('The End', love.graphics.getWidth()/2 - 150, love.graphics.getHeight()*0.1) 
else
...
The screen turns a blank white, whereas I had additionally wanted text printed on top of that screen. Similarly, I can change the first setColor() arguments, with the changes taking effect. But whatever I put below that rectangle() call is ignored. What is my problem?

Thanks in advance

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 5:04 am
by tentus
I don't get a blank white screen (see attached). Are you putting this code inside of love.draw?

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 5:21 am
by czarmurphy
Thanks for the response. Yes, it's in love.draw(). I honestly can't figure out what on earth is going on.

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 5:25 am
by hryx
I notice that your snippet lives inside a conditional statement (elseif gameOver then ...). Are you sure that gameOver is evaluating to true? Try just putting the code inside love.draw() without if/elseif/else, as in tentus' screenshot.

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 8:26 am
by molul
Can we see the full function code?

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 6:59 pm
by czarmurphy
Interestingly enough, the code still doesn't do as expected when outside the conditional. I can easily verify that the conditional is being entered, because I can change the color of the first setColor() and see the changes work as expected.

As for the code, I can post love.draw() in main and Player:update() (the only place where gameOver is modified) in Player:

main.lua

Code: Select all

function love.draw()
	
	if menu.run then
          menu:draw()
     
     elseif gameOver then
          --orig_r, orig_g, orig_b, orig_a = love.graphics.getColor( )
     
          love.graphics.setColor(255, 255, 255)
          love.graphics.rectangle('fill', 0, 0, love.graphics.getWidth(), love.graphics.getHeight())
          
          love.graphics.setColorMode('modulate')
          --ending = 'The End'
          love.graphics.setColor(0, 0, 0)
          love.graphics.print('The End', love.graphics.getWidth()/2, love.graphics.getHeight()*0.1) 
          
          --love.graphics.rectangle('fill', 0,0,love.graphics.getWidth(), love.graphics.getHeight())
     else
	
          --Diagnostic Info
          love.graphics.print('Current Position {', 5, 35)
          love.graphics.print(world.eventHandler.currentPos[1], 140, 35)
          love.graphics.print(world.eventHandler.currentPos[2], 180, 35)
          love.graphics.print(' }', 220, 35)

          love.graphics.print('Player Health: ', 5, 5)
          love.graphics.print(world.player.health, 100, 5)
          
          love.graphics.print('Glow Health: ', 5, 20)
          love.graphics.print(world.glow.health, 100, 20)
          
          love.graphics.setColor(255,255,255,255)
          love.graphics.line(0, 0, 0, 5000)
          love.graphics.line(0, 0, 5000, 0)
          love.graphics.line(0, 5000, 5000, 5000)
          love.graphics.line(5000, 0, 5000, 5000)

          fps = love.timer.getFPS()
          love.graphics.print('FPS: ', 5, 50)
          love.graphics.print(fps, 50, 50)
		  
		  love.graphics.print('Pulse: ', 5, 85)
		  if world.player.isPulseActive == false then
			love.graphics.print('false', 65, 85)
		  else
			love.graphics.print('true', 65, 85)
		  end
		  
		  love.graphics.print('Z1: ', 5, 100)
		  love.graphics.print(world.itemsInZones[1], 50, 100)
		  love.graphics.print('Z2: ', 5, 115)
		  love.graphics.print(world.itemsInZones[2], 50, 115)
		  love.graphics.print('Z3: ', 5, 130)
		  love.graphics.print(world.itemsInZones[3], 50, 130)
          
          world:draw()
          
          love.graphics.rectangle('fill', 0,0,love.graphics.getWidth(), love.graphics.getHeight())
     end
		
end
Player.lua (you can probably ignore most of this)

Code: Select all

function Player:update(dt)

	self.health = self.health - 100
     
     if self.health < 1 then
		--invoke loss condition
          --love.graphics.setColor(0, 0, 0, 0)
          love.graphics.setFont(font_end)
          gameOver = true                                -- Here
     end
	--Calculate color
	colorPerc = self.currentPulseCD/self.maxPulseCD
	
	if self.currentPulseCD == 0 then
		color = {1, 1, 1, 1}
	else
		color = {0 + colorPerc, 1, .5 + math.pow(colorPerc,2)/2, 1}
	end
	
	self.color = color
	
	
	--Calculate Pulse CD
	if self.currentPulseCD ~= 0 then
		self.currentPulseCD = self.currentPulseCD - 1
	end
	
	--Calculate radius
	if self.breathDirection == "in" then
	
		if self.radius < self.minRadius then
		
			self.breathDirection = "out"
			
		end
		
		self.radius = self.radius - 750*(1.0/self.health)
		
	end
	
	if self.breathDirection == "out" then
	
		if self.radius > self.maxRadius then
		
			self.breathDirection = "in"
			
		end
		
		self.radius = self.radius + 750*(1.0/self.health)
		
	end
	
	self.pixelEffect:send('position', {self.x, self.y})
	self.pixelEffect:send('size', self.radius)
	self.pixelEffect:send('col', self.color)
	self.particleSys:update(dt, self.glowhp)
	
end
Thank you again for the continued support.


EDIT: So I commented out the entire (original) love.draw() call and replaced it with only the problematic code, and it printed "The End", like I wanted it to. So that definitely means something... Are the other conditional blocks somehow being entered? Or is it something to do with setColor()?

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 7:04 pm
by tentus
Why do you have massive rectangles being draw at the end of the conditions? Remember, things are draw in the order they are typed, so a rectangle at the end of the else is going to cover up anything that came before it. Hence, the default case in your if statement is gonna be a big blank rectangle.

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 7:07 pm
by czarmurphy
Funny you should mention that. This is a group project, and in my own time, I, wondering the same, commented out that portion of the code. Turns out that it's necessary in that conditional block, or the player is not drawn correctly.

But that shouldn't affect the other conditional, should it?

Re: Noob Question: setColor/print troubles

Posted: Fri Feb 24, 2012 7:59 pm
by molul
I suggest reducing the problem. What happens if you just put this in your love.draw()? (commenting the rest):

Code: Select all

if gameOver then
          --orig_r, orig_g, orig_b, orig_a = love.graphics.getColor( )
     
          love.graphics.setColor(255, 255, 255)
          love.graphics.rectangle('fill', 0, 0, love.graphics.getWidth(), love.graphics.getHeight())
          
          love.graphics.setColorMode('modulate')
          --ending = 'The End'
          love.graphics.setColor(0, 0, 0)
          love.graphics.print('The End', love.graphics.getWidth()/2, love.graphics.getHeight()*0.1) 
          
          --love.graphics.rectangle('fill', 0,0,love.graphics.getWidth(), love.graphics.getHeight())
     end

Re: Noob Question: setColor/print troubles

Posted: Sat Feb 25, 2012 6:51 am
by czarmurphy
One of my team members (who had been working on similar code) found and fixed the problem. BlendMode, which had previously been altered, needed to be set to 'alpha'. Thanks for all the help.