Function call in love.update seems to only happen once
Posted: Tue Mar 03, 2020 9:22 am
I'm working on a Tetris clone for practice, and I've run into a problem defining the floor so that the pieces don't fall off the screen. I've got two classes, Pieces and Blocks. Pieces are made up of Blocks, and store the coordinates of each block in a nested table:
I've written a function called Piece:collides() that right now only checks the y coordinate of each block and sets the piece's dy to 0. In the current code, I've made the y coordinate to hit pretty small in order to eliminate the possibility that it's stopping after it falls off the screen:
One of the other things I've checked with this function is reversing the operator to v.y <= 50 to check that it could trigger at all. When I do this, the piece never moves, as its starting position is lower than 50.
Finally, here is my love.update() function in main, where it's called:
Everything else in this function works as expected. Piece:drop() is probably the closest related to Piece:collides(), as it's also changing the dy:
The other test I tried was printing the y coordinates to the screen as it ran to make sure the piece was where I expected it to be. It went above 50 without ever stopping.
I'm really not sure where to go from here. As far as I can tell it seems to be only calling Piece:collides() once when gameState turns to 'play', but I see no reason why that should be happening.
Please let me know if there's any other code I should post.
Code: Select all
-- stores upper left corner coordinates for each block to use in collision detection
self.coordinates = {{x = self.blockA.x, y = self.blockA.y}, {x = self.blockB.x, y = self.blockB.y},
{x = self.blockC.x, y = self.blockC.y}, {x = self.blockD.x, y = self.blockD.y}}
Code: Select all
function Piece:collides()
for _, v in pairs(self.coordinates) do
if v.y >= 50 then
return true
end
end
return false
end
Finally, here is my love.update() function in main, where it's called:
Code: Select all
function love.update(dt)
if gameState == 'play' then
piece.dy = GRAVITY
if love.keyboard.isDown('left') then
piece.dx = -25
elseif love.keyboard.isDown('right') then
piece.dx = 25
else
piece.dx = 0
end
if love.keyboard.isDown('down') then
piece:drop()
else
piece.dy = GRAVITY
end
if piece:collides() then
piece.dy = 0
end
piece:update(piece.dx, piece.dy, dt)
end
end
Code: Select all
function Piece:drop()
self.dy = GRAVITY * 5
end
I'm really not sure where to go from here. As far as I can tell it seems to be only calling Piece:collides() once when gameState turns to 'play', but I see no reason why that should be happening.
Please let me know if there's any other code I should post.