[英]pong program in python, cannot move paddle with mouse
大家好,我正在做一项家庭作业,我必须通过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()
我在这里看到一些问题:
首先,您已经定义了“ Ball”和“ Paddle”类,但是您似乎并没有使用它们。 而是在main()函数中执行以下操作:
the_ball=games.Sprite(image=ball_image,
x=600,
y=250,
dx=2,
dy=-2)
通过仅将其定义为Sprite,您仅使用LiveWire的Sprite对象中已定义的逻辑,而完全忽略了Ball或Bar类。 相反,您可能想创建一个“球”和“条”对象。 例如,要创建“球”对象,请将上面的行更改为...
the_ball=Ball(image=ball_image,
x=600,
y=250,
dx=2,
dy=-2)
因此,您已经定义了Ball类,并(使用上面提供的更改的代码)将在坐标x = 600和y = 250处创建ball。 为了使该球移动,需要更改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”类的功能(这将更改基于dx和dy的x和y值)。
希望这可以让您开始尝试做的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.