0

嘿,我正在做一个家庭作业,我必须通过 pygame 和 livewire 创建一个单人乒乓球游戏。我的代码大部分都完成了,但我确实有一个问题。屏幕不会更新,因此球拍不会移动,球也不会反弹。我在桨和球上都有一个更新方法,但由于某种原因它不起作用。这是我的代码谢谢!

更新:我不得不重做一些事情,但我现在可以调用我的课程并且球会反弹,但是我无法移动桨。我不知道为什么这不起作用,因为 self.y = games.mouse.y 应该更新我的桨的 y 坐标。然而,这是我重新编辑的代码,感谢到目前为止的帮助!

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()
4

1 回答 1

1

我在这里看到一些问题:

首先,您已经定义了“Ball”和“Paddle”类,但您似乎没有使用它们。相反,您在 main() 函数中执行以下操作:

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

通过仅将其定义为 Sprite,您仅使用已在 LiveWire 的 Sprite 对象中定义的逻辑,完全忽略了您的 Ball 或 Bar 类。相反,您可能想要创建一个“Ball”和“Bar”对象。例如,要创建一个“Ball”对象,您可以将上面的行更改为...

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

因此,您已经定义了一个 Ball 类,并且(使用我上面提供的更改代码)您将在坐标 x=600 和 y=250 处创建球。为了让这个球移动,x 和 y 坐标需要改变。例如,要将其向右移动 20 个单位,x 需要更改为 620。

因此,您需要考虑 x 和 y 坐标如何变化。查看 LiveWires 代码(如果您好奇,请在下一堂课上与您的老师讨论如何访问 LiveWires 代码)我阅读了以下内容:

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

所以,现在,你的 Ball 类只是继承自 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)

尝试更改它,使其继承自 Sprite 和 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)

你在这里所做的是让你的对象不仅继承“Sprite”类的功能(它处理让它在屏幕上提供的坐标处绘制)而且继承“Mover”类的功能(它改变了x 和 y 值基于 dx 和 dy)。

希望这将使您开始尝试做的事情。

于 2013-04-15T18:27:18.920 回答