[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?



Shandy,

Thank you for your suggestions.  I know that I have a long way to go
in terms of making my code more readable, more elegant, and will be
able to make it faster and prettier as I get more skills under my
belt.  I tried to define the add_score function outside of this block,
but it didnt have the total enemies killed yet.  Like I said, I know
it's not pretty, but it works (and since I have to have it done by
tomorrow night, I'm doing my best possible attempt with the skills I
have to make it work for the present).  Later, I will be able to go
through and clean up a LOT of this code (there are other places too
where I had to do things ugly ways to make them work).  But I
appreciate the suggestions - they will all help me learn and become a
better programmer :)

For the moment - adding the "flip" worked, James, thanks! Just adding
that one line of code ~ I had a feeling it would be something like
that, and was feeling very boneheaded that I couldnt find it.  The
game still has a problem when I get a score that makes the high score
list (because I'm still asking for the user name in a prompt in the
console window), but I have another idea to try to get that working. 
I'll send you guys an update! But thanks so much for the help ~ I now
have a working "you didnt make the high score list" game end!

*celebrates*

~Denise

On 4/27/05, Shandy Brown <sjbrown@xxxxxxxxx> wrote:
> 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
> >
>