【问题标题】:Java - Breakout physics, ball direction on paddle collision?Java - 突破物理,桨碰撞时的球方向?
【发布时间】:2014-04-16 14:34:43
【问题描述】:

我正在创建一个 Breakout 游戏来熟悉 Java。 目前我一切正常,但我注意到球似乎朝同一个方向起飞。

我已经对其进行了编程,因此当球击中球拍时,Y 速度会反转。这可行,但球似乎遵循相同的路线......

如何让碰撞看起来更真实?

当球击中球拍的左侧时,我想将其重定向回左侧,但我不确定以哪个角度反射它。任何人都可以提供一个公式来帮助我计算出在接触球拍左侧或右侧时我需要引导球的角度吗?

【问题讨论】:

  • 你能告诉我们你的碰撞代码吗?使用它可能更容易看到您的要求。
  • 我怀疑问题是关于如何允许用户稍微改变方向,而不是在击球时简单地反转 Y 方向。否则,球只是进入一个简单的模式,很难甚至不可能击中一些砖块。几十年前,我在 Apple 上使用 Integer BASIC 发现了同样的问题。
  • @FredLarson - 这正是我的意思。你能提供你的解决方案吗(即使是几十年前的事了)?
  • @user3422952:我想我当时还没有解决它。使用 40x40 低分辨率图形,球方向没有很多好的选择。球实际上是一个大胖像素。除了水平、垂直或对角线运动之外的任何东西,球看起来就像真的在爬楼梯。现代屏幕分辨率提供了更好的可能性。请参阅我的回答以获取建议。

标签: java graphics collision


【解决方案1】:

如果球从顶部击中球拍,则取消Y 速度。

如果球从侧面击中球拍,则取消X 速度。

【讨论】:

    【解决方案2】:

    反转垂直速度对于perfectly elastic collision 来说是正确的做法,这是您在突破游戏中想要的(球在碰撞后保持其总速度)。

    可以通过随机化初始球的位置和速度,或者通过将碰撞动力学更改为不切实际来避免遵循相同路线的问题。您可以向两个坐标添加一个小的随机分量(注意保持总速度相同),或者以不同的角度发送球,具体取决于球击中垫的位置(这是许多此类游戏所做的) .

    要做后面的事情,你需要计算出球碰到垫子的绝对位置,将其归一化(通过减去垫子位置并除以垫子长度),并将其映射到一个角度范围内(可能是-80到80 度)。然后,您可以使用三角函数计算所需的水平和垂直速度。

    【讨论】:

      【解决方案3】:

      一个想法可能是使用桨的运动来稍微改变方向。比方说,如果击球时球拍向右移动,除了反转 Y 方向之外,将球的 X 速度向右稍微改变一点。这为用户提供了一种实际使用一些技巧来正确“英语”的方法。

      【讨论】:

        【解决方案4】:

        涉及两个独立的问题,一个是设计问题,一个是物理问题。最后,物理问题可能有更简单的解决方案:

        1. 计算桨上的碰撞点
        2. 计算桨的瞬时水平速度 pvx
        3. 计算撞击点的规范外表面法线 (nx,ny)。这是设计决策,在桨的中间部分可能需要 (nx,ny)=(0,1),而在左侧 (nx,ny)=(-1,0) 或通常在 WNW 方向, 在右侧对应 (nx,ny)=(1,0) 或在一般 ENE 位置。
        4. 使用与移动的无限大质量物体碰撞的物理公式来计算新的速度矢量 (vx,vy):

          dot = nx*(vx-pvx)+ny*vy
          vx = vx - 2*dot*nx
          vy = vy - 2*dot*ny
          

          如果桨和球在碰撞后分离不够快,可以检查点积 dot 是否为正,以避免虚假的碰撞计算。

        【讨论】:

          猜你喜欢
          • 2013-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-14
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多