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