微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

碰撞检测工作正常,但分数飙升,因为发生了多次碰撞 (pygame)

如何解决碰撞检测工作正常,但分数飙升,因为发生了多次碰撞 (pygame)

在壁球比赛中(类似于乒乓球,但只有一名球员,球会从墙上弹开。)我对球和球拍进行了碰撞检测,当它们发生碰撞时,得分加 1。我遇到了问题碰撞:当球碰到球拍的顶部或底部时,它会像这样 https://i.imgur.com/w2DrOft.gif 。我用 ball.vx = -abs(ball.vx) 解决了这个问题,现在看起来像这样: https://i.imgur.com/6duDp6g.gif 。虽然碰撞和弹跳效果很好,但当发生顶部或底部碰撞时,分数会立即提高几个数字。如果您只看到碰撞并忽略分数,则根本不会引起注意,但同时发生更多碰撞并且分数会飙升。

hits = 0 

font = pygame.font.Font('freesansbold.ttf',25)
def Objects(paddle,ball,hits,font,black):
    temp = hits

  if ball.BallRect.colliderect(paddle.PaddleRect):
  
          ball.vx = -abs(ball.vx)
      
          score_text = font.render(f"score: " + str(hits + 1),True,black)
          temp += 1 
  else: 
          score_text = font.render(f"score: " + str(hits),black)
          window.blit(score_text,(20,20))

   return temp
 
  done = False 
  while not done: 
      hits = Objects(paddle,black=
      pygame.display.update() 
    
      clock.tick(120)

如何修正分数?

解决方法

仅当球向右移动时才增加分数。这意味着只有 ball.vx 大于 0 时分数才会增加。您需要在改变球的方向之前(在改变 ball.vx 之前)这样做:

def Objects(paddle,ball,hits,font,black):

    if ball.BallRect.colliderect(paddle.PaddleRect):
  
          if ball.vx > 0:
              hits += 1
          ball.vx = -abs(ball.vx)
      
    score_text = font.render(f"Score: " + str(hits),True,black)
    window.blit(score_text,(20,20))

    return hits

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。