2011-06-26 58 views
-4

我很累,而且我一直试图运行这一整天。 IT是一种乒乓球游戏,球从墙上反弹并与用户的“板”或桨接触。我已经花了一段时间来调试,结果发现我的iCollide和iGet_Velocity部件导致了很多问题。在Python中调试乒乓游戏

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() 
+1

你能提供一些关于你所看到的具体问题的细节吗?否则它不是一个问题和更多的代码审查 – lunixbochs

+0

对不起。在与桨接触后,游戏结冰。 – Louis93

回答

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 

你应该尝试做的是找到过板坯球的脸相交,然后根据该方向反映球的速度。现在这个代码没有经过测试,因为我无法让你的例子运行。但是它应该让你知道正确的解决方案应该做什么。

+0

嘿,你介意解释计算时间部分吗?不应该是slab.iVelocity,因为我们希望球具有板坯击中它的速度? – Louis93

+0

伟大的,很好的答案。我觉得很有趣,你能够像以前那样快速地输入这个功能。它没有执行到完美,但其他函数中还有一些其他错误,但我现在理解它背后的逻辑。非常感谢! – Louis93

3

这两条线看潦草:

self.dx += self.dx + new_dx 
    self.dy += self.dy + new_dy 

尝试:

self.dx += new_dx 
    self.dy += new_dy 
+0

我解决了这个问题,但是当我这样做的时候忘了保存它。我更关心物体是否在逻辑上与另一个进行通信...... – Louis93

+0

尽管如此,它仍然无法工作。球会通过一个静止的光标。 – Mikola