[Tutor] How to create delay in game

Nicholas Perito nperito at gmail.com
Tue Nov 21 04:02:37 CET 2006


Hello,

I new to programming and this is my first post. I'm learning Python via 
"Python Programming for the Absolute Beginner" by Michael Dawson. I've 
written a pong game  into which I want to insert a delay between sprite 
initializations. Right now, if an "Atom" sprite reaches the bottom of 
the screen, the next Atom sprite appears immediately. Instead, when the 
sprite reaches the bottom, I want the message "Two (or One) atoms left!" 
to appear for it's lifetime before the next Atom sprite appears. I've 
tried to create a delay by making it crunch numbers, but that hasn't 
worked well.

Anyway, the code is below, and the place where I want to create a delay 
is marked. Oh, and constructive criticism of the code is welcome--I'm 
not too sensitive.

Thanks a lot to anyone who can help!

(It's called 'Atom Pong' because I had a cool graphic)

# Atom Pong
# Nic Perito 11/06

import random
from livewires import games, color

SCREEN_WIDTH = 1000
SCREEN_HEIGHT = 700
THE_SCREEN = games.Screen(SCREEN_WIDTH, SCREEN_HEIGHT)
life = 3

class Atom(games.Sprite):
    """ Atom image """
     
    image = games.load_image("atom.jpg")
    def __init__(self, screen, x, y, dx, dy):
        """ Initialize atom object. """
        self.init_sprite(screen = screen, x = x, y = y,
                             dx = dx, dy = dy, image = Atom.image)

    def moved(self):
        """ Reverse a velocity component if edge of screen reached. """
        global life
        dx, dy = self.get_velocity()
        self.rotate_by(3)
        if self.get_right() > SCREEN_WIDTH:
            self.set_right(SCREEN_WIDTH)
            self.set_velocity(-dx, dy)
        if self.get_left() < 0:
            self.set_left(0)
            self.set_velocity(-dx, dy)
        if self.get_top() < 0:
            self.set_velocity(dx, -dy)
        if self.get_bottom() > SCREEN_HEIGHT:
            self.destroy()
            life -= 1
            if life == 0:
                self.game_over()
               
            if life == 2:
                games.Message(screen = self.screen,
                      x = 150, y = 20,
                      text = "Two atoms left!", size = 40, color = 
color.yellow,
                      lifetime = 200)
                #HERE'S WHERE I WANT A DELAY
                Atom(self.screen, x = (SCREEN_WIDTH - 76), y = 76,
                        dx = 6, dy = 5)

            if life == 1:
                games.Message(screen = self.screen,
                      x = 150, y = 45,
                      text = "One atom left!", size = 40, color = 
color.yellow,
                      lifetime = 200)
                #HERE'S WHERE I WANT A DELAY
                Atom(self.screen, x = 76, y = 76,
                        dx = 6, dy = 6)
           
    def handle_deflect(self):
        """ Deflect atom. """
        dx, dy = self.get_velocity()
        self.set_velocity(dx + random.randrange(2,4), -dy)

    def game_over(self):
        """ End the game. """
        # destroy all game objects except the Text object (player's score)
        for game_object in self.screen.all_objects():
            if not isinstance(game_object, games.Text):
                game_object.destroy()
               
        # show 'Game Over' for 250 mainloop() cycles
        games.Message(screen = self.screen,
                      x = SCREEN_WIDTH/2, y = 400,
                      text = "Game Over", size = 90, color = color.red,
                      lifetime = 500, after_death = self.screen.quit)

class Bonus(games.Sprite):
    """ Atom bonus image """
    image = games.load_image("bonus.jpg")
    def __init__(self, screen, x, y, dx, dy):
        """ Initialize atom object. """
        self.init_sprite(screen = screen, x = x, y = y,
                             dx = dx, dy = dy, image = Bonus.image)

    def moved(self):
        """ Reverse a velocity component if edge of screen reached. """
        dx, dy = self.get_velocity()
        self.rotate_by(-3)
        if self.get_right() > SCREEN_WIDTH or self.get_left() < 0:
            self.set_velocity(-dx, dy)
        if self.get_top() < 0:
            self.set_velocity(dx, -dy)
        if self.get_bottom() > SCREEN_HEIGHT:
            self.destroy()
    def handle_deflect(self):
        """ Deflect atom. """
        dx, dy = self.get_velocity()
        self.set_velocity(dx, -dy)


class Paddle(games.Sprite):
    """
    A paddle controlled by player to 'deflect' atoms.
    """
    image = games.load_image("paddle.jpg", transparent = False)

    def __init__ (self, screen, x, y):
        """ Initialize paddle object. Create a Text object for player's 
score. """
        self.init_sprite(screen = screen, x = x, y = y, image = 
Paddle.image)
        self.score_value = 0
        self.score_text = games.Text(screen = self.screen, x = 
SCREEN_WIDTH/2, y = 20,
                                     text = "Score: 0", size = 25, color 
= color.white)

    def moved(self):
        """ Move paddle to mouse x position. """
        x, y = self.get_pos()

        if self.screen.is_pressed(games.K_RIGHT):
            x += 9

        if self.screen.is_pressed(games.K_LEFT):
            x -= 9

        self.move_to(x,y)

       
        if self.get_left() < 0:
            self.set_left(0)
        if self.get_right() > SCREEN_WIDTH:
            self.set_right(SCREEN_WIDTH)
        self.check_for_impact()

    def check_for_impact(self):
        """ Check if paddle hits atoms. """
        for atom in self.overlapping_objects():
            self.handle_deflect()
            atom.handle_deflect()

    def handle_deflect(self):
        """ Increase and display score. """

        bonus = []
        for i in range(0, 5000, 50):
            bonus.append(i)
        self.score_value += 10
        self.score_text.set_text("Score: " + str(self.score_value))
        if self.score_value in bonus:
            Bonus(self.screen, x = random.randrange(800)+ 76, y = 76,
                  dx = random.randrange(10)+2, dy = random.randrange(3)+ 2)
           
            games.Message(screen = self.screen,
                      x = SCREEN_WIDTH/2, y = 300,
                      text = "BONUS!", size = 90, color = color.red,
                      lifetime = 50)
          
   


   


def main():     
    my_screen = THE_SCREEN
    my_screen.mouse_visible(False)
    background_image = games.load_image("black.jpg", transparent = False)
    my_screen.set_background(background_image)

   
    Atom(screen = my_screen, x = 76, y = 76,
          dx = 6, dy = 5)

   
    Paddle(screen = my_screen, x = SCREEN_WIDTH/2, y = 690)
   

    my_screen.mainloop()

# start program
main()






More information about the Tutor mailing list