[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: [pygame] Last Frame of Animation/Game Loop Problem
Hi,
I'm not sure if you got your question answered already, but here is my suggestion.
The basic problem with your code is with this line:
clock.tick(1)
That tells pygame that after doing whatever code runs in your loop, it should wait until a total of 1 second elapses before moving on. I have typically placed this line *after* the pygame.display.update. That is, do all your code to draw, update to the screen, then allow pygame to wait for as long as it needs to, to keep the requested frame rate, before proceeding onto the next frame.
Here is an updated version. I moved a few things around and added a few print statements. I also changed your loop to a basic "while True' loop and added 'break' statements to exit your loop at the appropriate places. The final frame of animation shows up, then it waits for 4 seconds (because of your two calls to delay), then quits.
import pygame, sys
def main():
pygame.init()
screen = pygame.display.set_mode((600, 400))
frame_count = 0
# The clock helps us manage the frames per second of the animation
clock = pygame.time.Clock()
square = pygame.Rect((0,100),(50,50))
while True:
# Process events
for event in pygame.event.get():
if event.type == pygame.QUIT:
break # user pressed close button
# The main snake code
square.move_ip((50,0))
print(square)
frame_count += 1
print('Showing frame', frame_count)
# Erase the screen
screen.fill((50, 50, 50))
pygame.draw.rect(screen, (200,50,50), square)
# Bring drawn changes to the front
pygame.display.update()
# set fps
clock.tick(1)
if frame_count >= 5:
print('Exiting loop')
break
print("Out of loop")
pygame.time.delay(2000)
# This also works to bring up the last frame.
# pygame.event.clear()
# pygame.event.wait()
pygame.quit()
print("After quit")
pygame.time.delay(2000)
sys.exit()
main()
Hope this helps,
Irv
> On Jan 16, 2018, at 9:37 AM, dejohnso <dejohnso@xxxxxxxxxxx> wrote:
>
> I have having trouble with a basic game/animation loop.
>
> It seems like the final frame doesn't show up until after the game loop is done and pygame.quit() is called. An example is below - if it is run, I see the "Out of loop" output, then a pause, then the final frame, then the final pause.
>
> Am I doing something wrong? Is this specific to my setup/machine?
>
> import pygame, sys
>
> def main():
> pygame.init()
> screen = pygame.display.set_mode((600, 400))
>
> frame_count = 0
>
> # The clock helps us manage the frames per second of the animation
> clock = pygame.time.Clock()
>
> square = pygame.Rect((0,100),(50,50))
> done = False
> while not done:
> # Erase the screen
> screen.fill((50, 50, 50))
> # Process events
> for event in pygame.event.get():
> if event.type == pygame.QUIT:
> done = True
> # The main snake code
> square.move_ip((50,0))
> pygame.draw.rect(screen, (200,50,50), square)
> print(square)
> frame_count += 1
> if frame_count >= 5:
> done = True
> print(done)
> # set fps
> clock.tick(1)
> # Bring drawn changes to the front
> pygame.display.update()
>
> print("Out of loop")
> pygame.time.delay(2000)
> # This also works to bring up the last frame.
> # pygame.event.clear()
> # pygame.event.wait()
> pygame.quit()
> print("After quit")
> pygame.time.delay(2000)
> sys.exit()
>
> main()
>
>