如何让球从球拍上弹开?

时间:2014-04-06 22:58:03

标签: python pygame

我正在制作一个基本的乒乓球比赛(球拍是屏幕底部的一个矩形,球从屏幕顶部掉落)。我希望球在击中球拍时能够反弹回来。到目前为止,我已经编写了一些代码,可以让球从顶部和底部屏幕反弹,但是我在让球从球拍上反弹时遇到了麻烦。

我必须修改传递给test_collide_ball方法的参数。如果它的当前x值在桨的范围内,则它会反弹回来。

我一直在努力想出一个解决方案,我想的是如果球击中球拍的y坐标(高度),那么它会反弹回来。但它也必须在构成桨的x坐标范围内(因此桨的宽度)。

但是当我这样做时,球就会陷入困境。任何反馈表示赞赏!提前谢谢。

这是我的球类/方法的代码:

import pygame

class Ball:
   def __init__(self, x, y, radius, color, dx, dy):
      self.x = x
      self.y = y
      self.radius = radius
      self.color = color
      self.dx = dx
      self.dy = dy

   def draw_ball(self, screen):
      pygame.draw.ellipse(screen, self.color,
         pygame.Rect(self.x, self.y, self.radius, self.radius))

   def update_ball(self):
      self.x += self.dx
      self.y += self.dy

   def test_collide_top_ball(self, top_height):
      if (self.y <= top_height):
         self.dy *= -1

   def test_collide_bottom_ball(self, paddle):
      if (self.y == paddle.y) and (self.x >= paddle.x) and (self.x <= paddle.x + paddle.width):
         self.dy *= -1

2 个答案:

答案 0 :(得分:0)

似乎正在发生的事情是你的球进入碰撞区并反转它的方向。然而,球仍处于碰撞区域,并且它再次反转它的方向。

你应该研究的是去抖检查。简而言之,这是防止某些事情发生两次或更多次的代码(去除它)。

从你的代码示例中,当球进入桨区时,球的动量会反转。你可能添加的是一个布尔标志,看看你是否已经检测到球进入了区域。首次检测到时,将标志设置为true。当球移动到区域之外时,将标志设置为false。如果旗帜是假的,只能扭转球的动量。

所以,(删除我生锈的Python)

def test_collide_bottom_ball(self, paddle):
  if (self.y == paddle.y) and (self.x >= paddle.x) and (self.x <= paddle.x + paddle.width) and (!self.hitPaddle):
     self.dy *= -1
     self.hitPaddle = true
  else
     self.hitPaddle = false

在您的实体中:

self.hitPaddle = false

答案 1 :(得分:0)

就像@MrDoomBringer所说,你需要防止它卡在垫子里。

解决这个问题的一个简单方法是检查self.dy是否为正 - 球向下移动。这样你也可以在&#34;内添加相同的&#34;像检查X-pos那样检查Y-pos。否则,除非您使用正确的速度等,否则与精确的Y坐标发生冲突非常困难。

另一件事 - 如果你有一个球,你很可能想要将它的大小添加到等式中。然后你可能想要使用一些更奇特的碰撞技术,例如:http://www.migapro.com/circle-and-rotated-rectangle-collision-detection/