简体   繁体   中英

pong program in python, cannot move paddle with mouse

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM