​Hi,

​
On Tue, Jan 16, 2018 at 10:37 AM, dejohnso <dejoh...@cs.utah.edu> 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.
>

​Great self-contained example!

On Win 7 x86-64, Python 3.5.1, PyGame 1.9.2a0, I see 5 frames of animation,
with the last frame being presented an instant before "Out of loop" is
printed. This is the behavior I would expect, but it sounds like your last
frame comes 1s after printing?


> Am I doing something wrong?


​Everything here looks good to me. I would prefer the drawing code
(including display update) all in one place (idiomatically, at the end of
the frame). I also prefer `pygame.display.flip()`. Also, in this case,
`time.sleep(...)` instead of `.tick(...)` (due to the low framerate, see
below). But these are all suggestions; nothing as-is looks wrong.​


> Is this specific to my setup/machine?
>

​Since I can't reproduce it myself, this seems likely. What is your
setup/machine?

I have a few vague suspicions. If the input polling rate is very low, some
windowing systems will conclude the process is hung, and possibly draw some
kind of grayed-out overlay on the window, which can make it drop a frame or
two. Also, `.tick(...)` does some internal timekeeping history
measurements, meaning that the framerate provided is rather inaccurate,
especially on startup. That's why I'd prefer `time.sleep(...)` (OTOH, *slow*ing
the framerate should work just fine, so . . .).


> 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()
>
>
​(Waves from SoC)

Ian​

Reply via email to