[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] font/text in pygame - code in, but display at wrong time?



Hi.

Upon scanning your code, I found it very difficult to read.  It will help
us find the error if you do a few things to make it more readable.

First of all, it is very unusual to define a function INSIDE an if block.
Consider putting the def add_score() in the global scope, not inside the
if block.

Secondly, it looks like the code you pasted is doing several things.
Consider breaking them up into functions that contain a singular goal, the
way a paragraph is broken up into sentences, each sentence containing one
key idea.

Lastly, consider a single while loop that is responsible for drawing and
getting events, instead of having flip() calls and event functions
scattered throughout -- see the Chimp Tutorial on the Pygame website.

-sjbrown

On Wed, 27 Apr 2005, D. Hartley wrote:

> All,
>
> Well I'm still working on the centering part, but it is IN, and it is
> working.  Well, it was working in the sample program.  But it's not
> displaying on the graphics window at the right time, as follows below.
>  I think this might be the simple case of something being out of
> order, but I just can't get it right.  Could someone take a quick look
> and see if they see my (probably glaring) misplacement?
>
> So I tried to import this (working!) code into my game, and even
> tho it executes the function within which it's contained BEFORE
> waiting for the "y/n another game" response, it's not displaying the
> score then (I just managed to glimpse it in the second after I hit n,
> the score flashed on right before the window closed. So I know it's in
> there and works! Just not at the right time.)
>
> The code goes like this:
>
>          if lives == 0:
> ### trying addscore
>                gameover.play()
>                showGameOver(screen, background_image)
>                pygame.display.flip()
>
>                def add_score():
>                    high_scores = pickle.load(file("scores.pik"))
>                    score = total_enemy_hits
>                    if score > high_scores[-1][0]:
>                        print "Ta da! You got", total_enemy_hits,
> "Ranch Delivery Devices!"
>                        name = read_string("You made the high score
> list! What's your name? ")
>                        user_score = (score,name)
>                        high_scores.append(user_score)
>                        high_scores.sort(reverse=True)
>                        del high_scores[-1]
>                        pickle.dump(high_scores, file("scores.pik", "w"))
>                        x, y = 230, 270
>                        for score, name in high_scores:
>                            slip = 30 - len(name)
>                            slip_amt = slip*" "
>                            font = pygame.font.Font(None, 25)
>                            text = font.render("%s%s%s" %
> (name,slip_amt,score), 1, (255, 255, 255, 0))
>                            screen.blit(text, (x,y))
>                            y += text.get_height()
>                    else:
>                        print "Sorry, you only got", total_enemy_hits,
> "Ranch Delivery Devices."
>                        print "You didn't quite make the high score list!"
>                        x, y = 230, 270
>                        for score, name in high_scores:
>                            slip = 30 - len(name)
>                            slip_amt = slip*" "
>                            font = pygame.font.Font(None, 25)
>                            text = font.render("%s%s%s" %
> (name,slip_amt,score), 1, (255, 255, 255, 0))
>                            screen.blit(text, (x,y))
>                            y += text.get_height()
>                        print "Better luck next time!"
>
> #                pdb.set_trace()
>                add_score()
>
>                answer = ""
>                while not answer in ("y","n"):
>                   for event in pygame.event.get():
>                      if event.type == KEYDOWN:
>                         if event.key == K_n:
>                            answer = "n"
>                         elif event.key == K_y:
>                            answer = "y"
>                if answer == "n":
>                    running = 0
>                else:
>                    return 1
>
>            #refresh the display
>            pygame.event.pump()
>            pygame.display.flip()
>
>    #well, nice playing with you...
>    screen = pygame.display.set_mode((640, 480))
>    return 0
>
> See, it seems to me that I define and execute the add_score function
> BEFORE the "do you want to play again" bit. But it doesnt display
> until AFTER you hit that key (or clicking outside the window and
> clicking back, see below), at which point the game goes onto the
> next thing (i.e., either refreshes and starts the game over, or closes
> the window).  Like I said I know it's in there, because I saw it flash
> on after I hit the n key, right before the window closes.  I tried
> moving the showgameover/flip, commenting out the different
> flip/pump/etc commands (these are a little out of my league,
> experience-wise), and tried rearranging things as best I could. (And
> yes, I know defining the add_score function right there is probably
> not elegant, but if I dont do it that way I get other errors).  Am I
> missing something glaringly obvious? If I define and use the add_score
> function before the keystroke commands, why is it displaying after?
>
> P.S.  I should also add that the "print" commands embedded within the
> add_score function ARE displaying at the appropriate time (i.e.,
> before I have to hit y/n).  Of course they're in the text/console
> window, but it does tell me that it's executing that add_score
> function at the right point in time.
>
> So why is it waiting until after the y/n keystroke to display the text
> I'm rendering on the game window?
>
> It will also display if I click to some other window and then click
> back to the game window.  I was having this problem with a different
> program in jython last night, and it ended up being a case of things
> in the wrong order (and I was successful in fixing it). But for the
> life of me I can't figure out what's in the wrong order that's causing
> it in *this* program.
>
> Thanks for any help you could offer, and for all the suggestions
> provided so far!
>
>
> ---------- Forwarded message ----------
> From: Sami Hangaslammi <sami.hangaslammi@xxxxxxxxx>
> Date: Apr 27, 2005 3:53 AM
> Subject: Re: [pygame] font/text in pygame
> To: pygame-users@xxxxxxxx
>
>
> On 4/27/05, Daniel Bickett <dbickett@xxxxxxxxx> wrote:
> > I wrote the following function recently. It places the image perfectly
> > in the center of the screen, using the rect of the image and the
> > screen.
> >
> > def centerImgOnScreen( image_rect , screen_rect ):
> >     x = ( screen_rect.right / 2 ) - ( image_rect.right / 2 )
> >     y = ( screen_rect.bottom / 2 ) - ( image_rect.bottom / 2 )
> >     return x,y
>
> Let the library do the work for you. ;)
>
> image_rect.center = screen_rect.center
>
> --
> Sami Hangaslammi
>