0

Hey all im working on a homework assignment in which i have to create a single player pong game through pygame and livewire. I have the code mostly finished but I do have one issue. The screen does not update and in doing so the paddle doesn't move and the ball doesn't bounce around. i have an update method on both the paddle and the ball but for someone reason it doesn't work. Here is my code Thanks!

UPDATE: I had to redo somethings but I am now able to call on the my classes and the balls bounce around however I cannot move the paddle. I have no clue as to why this doesn't work since the self.y = games.mouse.y should update y coordinate of my paddle. Here is my re edited code however, and thanks for the help so far!

from livewires import games, color
import random

#make screen size

games.init(screen_width = 640, screen_height = 480 , fps = 50)

class Paddle(games.Sprite):

    image = games.load_image("paddle.bmp")

    def __init__(self):
        super(Paddle, self).__init__(image = Paddle.image,x = 10, y = games.mouse.y)
        self.score = games.Text(value = 0, size = 25, color = color.black,
                                top = 20, right = games.screen.width - 8)

        games.screen.add(self.score)

        def update(self):

            self.y = games.mouse.y

            if self.top < 0:
                self.top = 0

            if self.bottom > games.screen.height:
                self.bottom = games.screen.height

"""
            self.check_hit()

            def check_hit(self):
                countdown = 0
                if countdown == 0:
                    for ball in self.overlapping_sprites:
                        self.score.value += 1
                        ball.dat_touch()
                        countdown == 10
                else: countdown -= 1
"""




class Ball(games.Sprite):

    image = games.load_image("ball.bmp")
    speed = 2

    def __init__(self, x = games.screen.height/2, y = games.screen.height/2):
        super(Ball,self).__init__(image = Ball.image,
                                  x = x, y = y,
                                  dx = Ball.speed, dy = Ball.speed)

    def update(self):
        if self.right > games.screen.width:
            self.dx = -self.dx

        if self.bottom > games.screen.height or self.top < 0:
            self.dy = - self.dy

        if self.left < 0:
            self.end_game()
            self.destroy()


    #def dat_touch(self):
        #self.dx = - self.dx
        #handles paddle touch
        #doesn't work = game_over
"""
      def end_game(self):

        end_message = games.Message(value = "Game Over",
                                    size = 90,
                                    color = color.red,
                                    x = games.screen.width/2,
                                    y = games.screen.height/2,
                                    lifetime = 5 * games.screen.fps,
                                    after_death = games.screen.quit)
        games.screen.add(end_message)

"""




def main():
    wall_image = games.load_image("background.bmp", transparent = False)
    games.screen.background = wall_image


    the_ball = Ball()

    games.screen.add(the_ball)

    the_paddle = Paddle()
    games.screen.add(the_paddle)

    games.mouse.is_visible = False
    games.screen.event_grab = True

    games.screen.mainloop()

main()
  • i will try that thank you EDIT: I tried putting pygame.display.update() and nothing happened. im assuming that line of code does not work with livewires. – Mark Thompson Apr 15 '13 at 17:34
  • Yeah. You are using the livewires screen, not the pygame screen. – ThisIsAQuestion Apr 15 '13 at 17:44
  • So, at the very least, the ball/paddle DO appear on the screen. Are you SURE that the update methods are being called? Try putting a print statement into the ball update method and make sure that that method is indeed being called – Mark Hildreth Apr 15 '13 at 17:57

1 Answers1

1

I see a few issues here:

First, you've defined your "Ball" and "Paddle" classes, but you don't seem to be using them. Instead, you're doing the following in your main() function:

the_ball=games.Sprite(image=ball_image,
                      x=600,
                      y=250,
                      dx=2,
                      dy=-2)

By only defining this as a Sprite, you are only using the logic that was already defined in LiveWire's Sprite object, completely ignoring your Ball or Bar class. Instead, you probably wanted to create a "Ball" and "Bar" object. For example, to create a "Ball" object, you would change the above line to...

the_ball=Ball(image=ball_image,
                      x=600,
                      y=250,
                      dx=2,
                      dy=-2)

So, you have defined a Ball class, and (using the changed code I've provided above) you would create at ball at the coordinate x=600 and y=250. In order to have this ball move, the x and y coordinate would need to change. For example, to move it to the right 20 units, the x would need to change to 620.

So, you need to consider how the x and y coordinates change. Looking through the LiveWires code (speak to your teacher during the next class as to how to access the LiveWires code if you're curious) I read the following:

# Some [objects] will, more specifically, move at regular intervals;
# their classes should subclass Mover (which < Timer) and
# define a moved method.

So, right now, your Ball class is only inheriting from Sprite...

class Ball(games.Sprite):

    image = games.load_image("ball.bmp")
    speed = 2

    def __init__(self, x = 100, y = 100):
        super(Ball, self).__init__(image = Ball.image,
                                   x = x, y = y,
                                   dx = Ball.speed, dy = Ball.speed)

Try changing this so that it inherits from both Sprite AND Mover...

class Ball(games.Sprite, games.Mover):

    image = games.load_image("ball.bmp")
    speed = 2

    def __init__(self, x = 100, y = 100):
        super(Ball, self).__init__(image = Ball.image,
                                   x = x, y = y,
                                   dx = Ball.speed, dy = Ball.speed)

What you're doing here is making your object not only inherit the functionality of the "Sprite" class (which handles having it draw on the screen at the coordinate provided) but also inherit the functionality of the "Mover" class (which changes the x and y values based on dx and dy).

Hopefully that will give you a start into what you're trying to do.

Mark Hildreth
  • 42,023
  • 11
  • 120
  • 109
  • I manged to do use the classes and make the ball bounce but I have an issue with moving the paddle. Thank you so much for your help – Mark Thompson Apr 16 '13 at 03:47
  • 1
    Are you sure that the update method is being called on the paddle object? If you put a print statement in that method, does something get printed to the console? – Mark Hildreth Apr 16 '13 at 12:06