如何将重力应用于弹跳球应用程序?

2023-11-21

我编写了一个相当简单的java应用程序,它允许您拖动鼠标,并根据您拖动鼠标的长度,它会朝那个方向射出一个球,并在球移动时从墙壁上弹起。

这是一个快速截图:
替代文本http://img222.imageshack.us/img222/3179/ballbouncemf9.png

屏幕上的每个圆圈都是一个 Ball 对象。球的运动被分解为 x 和 y 向量;

public class Ball {
    public int xPos;
    public int yPos;
    public int xVector;
    public int yVector;

    public Ball(int xPos, int yPos, int xVector, int yVector) {
        this.xPos = xPos;
        this.yPos = yPos;
        this.xVector = xVector;
        this.yVector = yVector;
    }

    public void step()
    {
        posX += xVector;
        posY += yVector;

        checkCollisions();
    }

    public void checkCollisions()
    {
        // Check if we have collided with a wall
        // If we have, take the negative of the appropriate vector
        // Depending on which wall you hit
    }

    public void draw()
    {
        // draw our circle at it's position
    }
}

这很好用。所有的球都从一面墙弹到另一面墙。

然而,我决定希望能够包含重力的影响。我知道物体以 9.8m/s 的速度向地球加速,但我不直接知道如何将其转换为代码。我意识到 yVector 会受到影响,但我对此的实验没有达到我想要的效果。

理想情况下,我希望能够为该程序添加一些重力效果,并允许球在落到“地面”之前弹跳几次。

我怎样才能创造出这种弹力、重力效果?我必须如何操纵每一步球的速度矢量?当它撞到“地面”时必须做什么,以便我可以让它再次反弹,但比上次弹得短一些?

感谢任何帮助为我指明正确的方向。


谢谢大家的评论!它已经运行得很好了!

在我的step()中,我像人们建议的那样向我的yVector添加了一个重力常数,这是我的检查Collision():

public void checkCollision()
{
    if (posX - radius < 0)              // Left Wall?
    {
        posX = radius;              // Place ball against edge
        xVector = -(xVector * friction);
    }
    else if (posX + radius > rightBound) // Right Wall?
    {
        posX = rightBound - radius;     // Place ball against edge
        xVector = -(xVector * friction);
    }

    // Same for posY and yVector here.
}

然而,球将继续在地板上滑动/滚动。我认为这是因为我只是在每次反弹时取其向量的百分比(90%),并且它永远不会真正为零。我是否应该添加一个检查,如果 xVector 变为某个绝对值,我应该将其更改为零?


您要做的就是不断地从 yVector 中减去一个小常数(代表 9.8 m/s 的值)。当球向下时(yVector 已经为负),这会使其走得更快。当它上升时(yVector 为正)它会减慢速度。

这不能解释摩擦力,所以物体应该永远弹跳。

编辑1: 为了考虑摩擦力,每当它反转(并且反转符号)时,请稍微降低绝对值。就像如果它在 yVector=-500 处命中一样,当您反转符号时,将其设为 +480 而不是 +500。您可能应该对 xVector 执行同样的操作以阻止它左右弹跳。

编辑2: 另外,如果您希望它对“空气摩擦”做出反应,请在每次调整时将两个矢量减少一个非常小的量。

编辑3: 关于永远在底部滚动的东西——取决于你的数字有多高,它可能是两件事之一。要么你的数字很大并且似乎需要很长时间才能完成,要么你正在四舍五入并且你的向量总是 5 或其他。 (5 的 90% 是 4.5,因此可能四舍五入为 5)。

我会打印出调试语句并查看向量编号是什么样的。如果它们达到 5 左右并停留在那里,那么您可以使用一个函数将您的分数截断为 4,而不是四舍五入到 5。如果它继续下降并最终停止,那么您可能必须提高摩擦系数。

如果您找不到简单的“舍入”函数,您可以使用 (0.9 * Vector) - 1,从现有方程中减去 1 应该做同样的事情。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将重力应用于弹跳球应用程序? 的相关文章

  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 替代位置基础系统(十六进制、八进制、二进制)如何工作?如何将它们转换为十进制?

    我以前在编程课上没有学过这一点 但现在我需要知道它 有哪些学习这些数字以及如何转换它们的好资源 我几乎会像记住乘法表一样记住这些 在我们日常的十进制系统中 基数或radix http en wikipedia org wiki Radix
  • Lockfree 标准集合和教程或文章

    有人知道用于无锁常用数据类型的实现 即源代码 的好资源吗 我正在考虑列表 队列等 锁定实现非常容易找到 但我找不到无锁算法的示例以及 CAS 的工作原理以及如何使用它来实现这些结构 查看 Julian M Bucknall 的博客 他 详细
  • 编程语言语法中尾随逗号的历史

    许多编程语言允许在其语法中在列表中的最后一项后面使用尾随逗号 据说这样做是为了简化自动代码生成 这是可以理解的 作为示例 以下是 Java 中完全合法的数组初始化 JLS 10 6 数组初始值设定项 http java sun com do
  • 什么是悲观主义?

    该问题有评论可以使用C 11的吗auto提高性能 https stackoverflow com questions 32510183 can the use of c11s auto improve performance这获得了很多选票
  • 更改 SKPhysicsBody 的身体形状

    除了定义 SKPhysicsBody 形状的主体之外 我不想更改任何其他内容 我该怎么做呢 我似乎找不到在哪里可以改变这个 甚至评论如何改变它 是的 我知道这必须小心完成 以便避免所有可能的新碰撞 重叠等 但抛开这些 我如何更改 SKPhy
  • 如何通用地减少子集平均值的计算?

    Edit 由于似乎没有人阅读此链接的原始问题 因此让我在这里介绍一下它的概要 正如其他人所问的 最初的问题是 给定大量值 总和将超过数据类型的值Double那么如何计算这些值的平均值呢 有几个答案说要按集合计算 比如取50个和50个数字 计
  • 快速约会算法

    我在一家咨询公司工作 大部分时间都在客户所在地 正因为如此 我很少见到同事 为了更好地了解彼此 我们将安排一个晚宴 会有很多小桌子 方便人们聊天 为了在聚会期间与尽可能多的不同的人交谈 每个人都必须每隔一段时间 比如每小时 换一张桌子 如何
  • 与随机数生成算法相关的种子是什么?为什么经常使用计算机时间来创建该种子?

    我读到了seeds用于初始化随机数生成器 但似乎种子的随机性对于从生成器获得良好的随机性并不重要 所以我想了解什么是seed实际上 为什么这么称呼呢 最后为什么time在计算机系统中是用来生成这样的种子的 伪随机数生成器生成数字序列 它不是
  • 算法:找到圆中的峰值

    Given n排列成圆圈的整数显示了一种可以找到一个峰值的有效算法 峰值是不小于它旁边的两个数字的数字 一种方法是遍历所有整数并检查每个整数以查看它是否是峰值 这产生O n 时间 似乎应该有某种方法来分而治之 以提高效率 EDIT 好吧 基
  • 承诺的反面是什么?

    承诺代表将来可能可用 或无法实现 的值 我正在寻找的是一种数据类型 它表示将来可能变得不可用的可用值 可能是由于错误 Promise a b TransitionFromTo
  • 有向无环图的人类可读文本表示

    一棵树有一堆人类和机器可读的文本表示 例如嵌套列表 以各种表示形式 例如 JSON 和 YAML 和 XML 与缩进相结合 它们使我们很容易想象得到的结构 但我没有看到任何具有相同水平可读性的东西有向无环图 https en wikiped
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 如何测试哈希函数?

    有没有办法测试哈希函数的质量 我希望在哈希表中使用时具有良好的分布 如果这可以在单元测试中验证 那就太好了 EDIT 为了澄清 我的问题是我已经使用了longJava 中的值的方式是第一个 32 位编码一个 ID 第二个 32 位编码另一个
  • 加密单个int的方法

    如何以廉价的方式对 32 位 int 进行双向加密 使每个数字都映射到该空间中的其他 int 并以难以预测的方式映射回来 当然 并且不需要在映射表中预先存储 42 9 亿个整数 您想要的是 32 位分组密码 不幸的是 大多数分组密码都是 6
  • 如何将惰性变量传递给函数参数而不对其求值,除非返回

    这个问题是针对python的 尽管我不介意用户分享其他语言的经验 基本上我的问题是尝试将惰性变量传递给函数 就我而言 我可能无法控制该函数 因此无法更改它以将生成器作为输入 示例 请注意 dict get 是函数的示例 但它很可能是 foo
  • 为什么这个函数不是纯粹的?

    在维基百科文章中https en wikipedia org wiki Pure function Impure functions https en wikipedia org wiki Pure function Impure func
  • 填充体积算法

    我有一个具有一定尺寸长度 宽度 高度的盒子 我有不同长度 宽度 高度的物品 是否有现有的算法可以确定放入盒子中的最佳物品 这称为装箱 切割库存 背包问题 并且是 NP 难问题 一般来说 您只能通过使用启发式方法获得近似解 请参见示例 htt
  • 从原点开始在离散 2D 网格上迭代向外螺旋的算法

    例如 这是预期螺旋的形状 以及迭代的每个步骤 y 16 15 14 13 12 17 4 3 2 11 18 5 0 1 10 x 19 6 7 8 9 20 21 22 23 24 其中线条是 x 轴和 y 轴 以下是算法每次迭代 返回
  • 有哪些学习线程编程的好资源? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 随着多核CPU在桌面上的兴起 多线程技能将成为程序员的宝贵资产 您能为想要学习线程编程的程序员推荐一些好的资源 书籍 教程 网站等 吗 看

随机推荐

  • 在 FXML 中使用 fx:id 作为 CSS id

    似乎在 FXML 中 如果您不指定 ID CSS 则默认使用 fx id 值 我之前的理解是这两者是完全不相交的 ID用于CSS并且仅用于CSS fx id 用于控制器中的 FXML 绑定 这可以通过一个小测试来演示 三个按钮 第一个带有
  • 如何在已安装的 Express 应用程序中共享会话

    我有一个相当复杂的基于 Express 的 Web 应用程序 它分为几个子应用程序 这些子应用程序也是 Express 应用程序 使用app use 如何在应用程序的所有部分之间无缝地使用同一会话 与 Connect 捆绑在一起的中间件具有
  • 如何在 C 中的分叉进程上使用 POSIX 信号量?

    我想分叉多个进程 然后在它们上使用信号量 这是我尝试过的 sem init sem 1 1 semaphore pshared value if pid 0 parent process wait NULL wait all child p
  • Python lambda 和作用域[重复]

    这个问题在这里已经有答案了 鉴于这段代码 funcs for x in range 3 funcs append lambda x print f for f in funcs 我希望它能打印出来 0 1 2 而是打印 2 2 2 关于 l
  • OSX 10.13.4 上堆栈安装 ghc-mod 因依赖项冲突而失败

    当我尝试通过堆栈安装 ghc mod 时 我最终遇到了这些依赖项冲突 Error While constructing the build plan the following exceptions were encountered In
  • 如何通过ldap中的域名获取用户的用户名和SID

    我正在尝试获取特定域的用户信息 该域将作为程序的输入 根据域名 它应该返回用户名 或用户的 NT Id 和 SID 的列表 我是 LDAP 编程新手 任何人都可以帮助我获取此列表 如果您使用 NET 3 5 及更高版本并谈论 Active
  • JavaFX 在场景中嵌入场景

    我有一个使用 javafx 场景来渲染某些内容的应用程序 我想将该渲染放入我制作的一些 GUI 中 也在 javafx 中 我该怎么做呢 基本上有一些容器我可以将场景放入其中 然后将该容器放入 GUI 中 抱歉 如果这是一个新手问题 我是
  • 类型特征:检查类是否具有特定功能(可能继承)

    我知道有很多可能的方法来检测一个类是否具有特定的功能 但没有一种方法真正适合我的具体情况 我当前用于检查成员函数是否正确的实现 除了继承函数之外 include
  • 图片框问题

    我有个问题 我有 3 个图片框 里面有 3 张不同的图像如图所示 我可以设置什么图片框3所以两张图片看起来都一样 EDITED 我想将pictureBox3移动到pictureBox2上 所以没有选项将它们合并为单个图像 确保图像在pict
  • unix管道多个作家

    如果有多个线程将固定长度数据 例如 4 字节地址 写入单个管道 并且该管道有一个读取器 是否可以保证读取器按顺序获取字节 换句话说 就是write 到管道原子 http pubs opengroup org onlinepubs 00969
  • 如果还不是可迭代的,则 Pythonic 转换为单例可迭代

    假设我有 def distance2 vector1 vector2 zipped zip vector1 vector2 difference2 vector2 vector1 2 for vector1 vector2 in zippe
  • 表单提交后隐藏/显示 Div?

    你好 我在让它工作时遇到了一些麻烦 非常简单 我想做的就是在提交 html 表单后显示一个 div
  • MVC 中的 MVC-ControllerTypeCache.xml

    在调试 ASP NET MVC 源时我发现 MVC ControllerTypeCache xml 文件被使用 但我无法理解这个文件的用途 我的意思是这个文件存储在哪里 asp net MVc 如何使用这个文件 请帮忙 该文件用于缓存控制器
  • Android项目的Gradle组装失败,找不到R.txt

    抱歉我的英语不好 我正在尝试使用 Android Studio 将我的项目迁移到 Gradle 但目前构建失败processDebugResources 错误信息 任务 app processAdultDebugResources 执行失败
  • 轻松测量经过的时间

    我正在尝试使用time 测量我的程序的各个点 我不明白的是为什么之前和之后的值是相同的 我知道这不是分析我的程序的最佳方式 我只是想看看需要多长时间 printf MyProgram before time ld n time NULL d
  • 绑定时 ObjectContext 实例已被释放[重复]

    这个问题在这里已经有答案了 这是我的代码 public class JobsRepository BaseNewsletterRepository public IEnumerable
  • 使用 Codeigniter 获取 PUT 请求

    我现在有一个 CodeIgniter 问题 我使用REST 控制器库 这真的很棒 创建一个 API 但我无法收到 PUT 请求 这是我的代码 function user put user id this gt get id echo use
  • “现在无法切换到旧模式” - tls.connect 函数中的 Node.JS apn 模块错误

    我正在尝试实现 Node JS apn 模块来连接到 APNS Apple 推送通知服务 以从运行 Ubuntu 12 04 的 Amazon EC2 实例上托管的节点服务器 使用 ExpressJS 将通知推送到 iPhone 设备 我收
  • http请求会自动重试吗?

    我正在尝试使用 GoLang 将数据推送到 apache 服务器 假设我的apache服务器暂时停止了 然后我的http请求会自动重试 我正在使用这个声明 resp err http DefaultClient Do req if err
  • 如何将重力应用于弹跳球应用程序?

    我编写了一个相当简单的java应用程序 它允许您拖动鼠标 并根据您拖动鼠标的长度 它会朝那个方向射出一个球 并在球移动时从墙壁上弹起 这是一个快速截图 替代文本http img222 imageshack us img222 3179 ba