调试Python乒乓球游戏
我很累,今天一直在尝试运行这个程序。这是一个乒乓球游戏,球会在墙上反弹,并且会碰到用户的“板子”或叫挡板。我尝试调试了很久,结果发现我的 iCollide 和 iGet_Velocity 这两个部分出了很多问题。
from livewires import games, color
games.init (screen_width = 640, screen_height = 480, fps = 50)
class Ball (games.Sprite):
def update (self):
if self.right>544:
self.dx = -self.dx
if self.top > 11 or self.bottom > 470:
self.dy = -self.dy
if self.left < 0:
self.iLost()
def iLost (self):
games.Message (screen = self.screen,
x = 340,
y = 240,
text = "Game Over",
size = 90,
color = color.red,
lifetime = 250,
after_death = self.screen.quit)
def ihandle_collision (self):
new_dx, new_dy = Slab.iVelocity()
self.dx += self.dx + new_dx #For handling collision, must take velocity of the mouse object and put add it to the velocity of the ball.
self.dy += self.dy + new_dy
class Slab (games.Sprite):
def update (self):
self.x = games.mouse.x
self.y = games.mouse.y
self.iCollide()
def iCollide (self):
for Ball in self.overlapping_sprites:
Ball.ihandle_collision()
def iVelocity (self):
self.get_velocity()
def main():
#Backgrounds
pingpongbackground = games.load_image ("pingpongbackground.jpg", transparent = False)
games.screen.background = pingpongbackground
#Ball: Initializing object and setting speed.
ballimage = games.load_image ("pingpongball.jpg", transparent = True)
theball = Ball (image = ballimage,
x = 320,
y = 240,
dx = 2,
dy = 2)
games.screen.add(theball)
#Paddle: Initializing ping pong object and setting initial poisition to the initial mouse position
slabimage = games.load_image ("pingpongpaddle.jpg", transparent = True)
theslab = Slab (image = slabimage,
x = games.mouse.x,
y = games.mouse.y)
games.screen.add(theslab)
games.mouse.is_visible = False
games.screen.event_grab = True
games.screen.mainloop()
main ()
2 个回答
3
这两行代码看起来有点可疑:
self.dx += self.dx + new_dx
self.dy += self.dy + new_dy
试试这个:
self.dx += new_dx
self.dy += new_dy
3
嗯,没有更多的数据,我不能确定问题出在哪里。不过,看起来你的碰撞反应代码有点问题。例如,在第一部分,你应该这样做,以正确处理边界条件:
def update (self):
if self.right>544 and self.dx > 0:
self.dx = -self.dx
if (self.top > 11 and self.dy < 0) or (self.bottom > 470 and self.dy > 0):
self.dy = -self.dy
if self.left < 0:
self.iLost()
另外,你的碰撞反应代码也有点奇怪。这段代码没有经过测试,但大致上是对的:(编辑:我加了更多注释,让它更清楚)
def iCollide (self):
for Ball in self.overlapping_sprites:
#Extract the components of the slab's velocity
slab_vx, slab_vy = self.iVelocity()
#Compute relative components of slab velocity
rel_vx, rel_vy = Ball.dx - slab_vx, Ball.dy - slab_vy
#Determine the time of intersection and the normal direction
#This is done to compute which face the ball hits
#Initially suppose that the objects intersect at t=infinity
t, nx, ny = 100000, 0, 0
#Check left/right faces
if rel_vx != 0:
#Check if ball hits left face
toi = (self.left - Ball.right) / rel_vx
if toi < t:
t, nx, ny = toi, -1, 0
#Check if ball hits right face
toi = (self.right - Ball.left) / rel_vx
if toi < t:
t, nx, ny = toi, 1, 0
#Check top/bottom faces:
if rel_vy != 0:
#Check if ball hits top face
toi = (self.top - Ball.bottom) / rel_vx
if toi < t:
t, nx, ny = toi, 0, -1
#Check if ball hits right face
toi = (self.bottom - Ball.top) / rel_vx
if toi < t:
t, nx, ny = toi, 0, 1
#Check if impact force properly corrects velocity
if Ball.dx * nx + Ball.dy * ny < 0:
#Reflect the ball's position
Ball.dx += Ball.dx * nx * 2.0
Ball.dy += Ball.dy * ny * 2.0
#Check if cursor movement is not pushing ball into paddle:
if slab_vx * nx + slab_vy * ny < 0:
Ball.dx += slab_vx
Ball.dy += slab.vy
你应该尝试找出球体与哪个平面相交,然后根据那个方向反射球的速度。现在这段代码并没有经过测试,因为我无法让你的例子运行。不过,它应该能给你一个正确解决方案应该做什么的概念。