JavaScript 碰撞检测系统不会忽略被阻止的碰撞

2023-12-03

我在使用迷你游戏开发过程中遇到问题EaselJS我的碰撞检测系统,我需要有人的帮助。当英雄(圆形位图)碰撞一个对象并且第一个对象后面有其他对象时,英雄会与两个对象碰撞,即使第二次碰撞被阻止,也会出现此问题。这是一个图像解释:

问题的原因非常简单,即使问题本身并非如此:

该碰撞检测系统基于圆的未来位置(而不是其实际位置),那么如果圆的下一个位置与矩形相交,它将反弹。问题是,如果未来的位置与两个矩形相交,圆就会在两个矩形中反弹——即使实际的圆运动被另一个矩形阻挡并且无法到达第二个矩形。

Update:请注意,仅当由于矩形创建顺序而按住向上箭头时,才会出现此问题。


这是相关的 JavaScript 代码:

                rects.forEach(function (rect) { // Affect all rects
                    // Collision detection:
                    // (This MUST BE after every change in xvel/yvel)

                    // Next circle position calculation:
                    var nextposx = circle.x + event.delta / 1000 * xvel * 20,
                        nextposy = circle.y + event.delta / 1000 * yvel * 20;

                    // Collision between objects (Rect and Circle):
                    if (nextposy + height(circle) > rect.y &&
                        nextposx + width(circle) > rect.x &&
                        nextposx < rect.x + rect.width &&
                        nextposy < rect.y + rect.height) {
                        if (circle.y + height(circle) < rect.y) {
                            cls("top");
                        }
                        if (circle.x + width(circle) < rect.x) {
                            cls("left");
                        }
                        if (circle.x > rect.x + rect.width) {
                            cls("right");
                        }
                        if (circle.y > rect.y + rect.height) {
                            cls("bottom");
                        }
                    }

                    // Stage collision:
                    if (nextposy < 0) { // Collided with TOP of stage. Trust me.
                        cls("bottom"); // Inverted collision side is proposital!
                    }
                    if (nextposx < 0) {
                        cls("right");
                    }
                    if (nextposx + width(circle) > stage.canvas.width) {
                        cls("left");
                    }
                    if (nextposy + height(circle) > stage.canvas.height) {
                        cls("top");
                    }
                });

JSFiddle


您必须独立处理水平和垂直碰撞。

我对你的 JSfiddle 做了一些小改动:http://jsfiddle.net/Kf6cv/1/现在应该可以了,我所做的是将您的一张支票分成两份:

if (nextposy + height(circle) > rect.y &&
    circle.x + width(circle) > rect.x &&
    circle.x < rect.x + rect.width &&
    nextposy < rect.y + rect.height) {
    if (circle.y + height(circle) < rect.y) {
       cls("top");
    }
    if (circle.y > rect.y + rect.height) {
        cls("bottom");
    }
}

if (nextposx + width(circle) > rect.x &&
    nextposx < rect.x + rect.width &&
    circle.y + height(circle) > rect.y &&
    circle.y < rect.y + rect.height) {
    if (circle.x + width(circle) < rect.x) {
        cls("left");
    }
    if (circle.x > rect.x + rect.width) {
        cls("right");
    }
}

这样做的原因是,如果同时检查两个方向,它将阻止两个方向的移动(或使其弹跳)(如图片中的红色图) - 即使它可以向一个方向移动。检查水平/垂直的顺序通常并不重要,通常仅当您的“英雄”100% 边缘到边缘接近另一个对象时才重要。但你可以做的是首先检查速度较高的方向,所以如果 |velX| > |速度|然后你首先检查是否存在水平碰撞。

另外我想说在检查后直接应用新位置会更安全,现在它会进行两次独立检查,然后应用两个方向的移动 - 我不确定这一点,但我可以想象这可能会导致稍后一些问题。

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

JavaScript 碰撞检测系统不会忽略被阻止的碰撞 的相关文章

  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 如何通过php获取网页的Open Graph协议?

    PHP 有一个简单的命令来获取网页的元标记 get meta tags 但这仅适用于具有名称属性的元标记 然而 开放图谱协议如今变得越来越流行 从网页获取 opg 值的最简单方法是什么 例如 我看到的基本方法是通过 cURL 获取页面并使用
  • 在闪亮的数据表中为每个单元格显示工具提示或弹出窗口?

    有没有什么方法可以为 r闪亮数据表中的每个单元格获取工具提示 有很多方法可以获取悬停行或列 但我找不到一种方法来获取行和列索引并为每个单元格显示不同的悬停工具提示 任何人都可以修改以下代码吗 library shiny library DT
  • javascript中按tab键时如何调用函数?

    我有一个这样的功能 function whenEmpty field if field value field style backgroundColor ffcccc alert Please fill the field field f
  • 如何让 jquery Tooltipster 插件适用于新创建的 DOM 元素?

    我正在使用 Tooltipster 插件http calebjacob com tooltipster http calebjacob com tooltipster 这很棒 但我已经动态生成了插入到 DOM 中的内容 工具提示程序似乎没有
  • 如何将送货地址复制到帐单地址

    我想知道是否可以将送货地址复制到帐单地址 当用户单击与送货地址相同的复选框时 送货地址值将被复制到账单输入字段 我完成了大部分部分 但我不确定如何将选择菜单 状态 值复制到帐单地址 我真的很感谢任何帮助 My code document r
  • 将数组排序为第一个最小值、第一个最大值、第二个最小值、第二个最大值等

    编写一个JS程序 返回一个数组 其中第一个元素是第一个最小值 第二个元素是第一个最大值 依此类推 该程序包含一个函数 该函数接受一个参数 一个数组 该函数根据要求返回数组 输入示例 array 2 4 7 1 3 8 9 预期输出 1 9
  • 将 javascript 整数转换为字节数组并返回

    function intFromBytes x var val 0 for var i 0 i lt x length i val x i if i lt x length 1 val val lt lt 8 return val func
  • 我可以停止 :hover 应用于元素吗?

    假设我有一些 CSS button hover font weight bold 我怎样才能防止 hover随意应用样式 我的目标用例是当元素被禁用时 例如 使用这个 HTML
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true
  • Select2 下拉列表动态添加、删除和刷新项目

    这让我发疯 为什么 Select2 不能在其页面上实现清晰的方法或示例如何在 Select2 上进行简单的 CRUD 操作 我有一个 select2 从 ajax 调用获取数据
  • JavaScript 代码在不使用 ActiveX 的情况下截取网站屏幕截图

    我有一个用户与之交互的 JavaScript 应用程序 我需要保存当前界面的外观 裁剪出我需要的部分 或者通过指定div只拍摄我需要的部分 然后发送回服务器 显然任何外部服务都无法做到这一点 我需要一个 JavaScript 或Flash
  • 如何将函数内的捕获错误传递给父级

    我有这几行代码示例 想知道下面的逻辑到底如何 try var response child console log why here catch err console log should show this err function c
  • JavaScript onresize 事件多次触发

    我在尝试仅在触发 onresize 事件时运行一次函数时遇到一些麻烦 我已经看过这个问题DOM onresize 事件 https stackoverflow com questions 1500312 javascript onresiz
  • 单击引导分页链接时调用 jquery 函数

    我想在单击引导分页链接时调用 jquery 函数 假设我想从第1页遍历到第2页 应该调用一个jquery函数 我正在使用以下代码 但它不起作用 ul pagination on click li function alert page ch
  • 显示覆盖以覆盖整个页面

    我有一个正在加载的网络应用程序iframe 我需要显示一个覆盖 div 来覆盖整个页面 问题是叠加层当前仅显示在iframe区域而不覆盖整个页面 我们的应用程序 子应用程序 是加载的一组应用程序的一部分iframe 你可以做这样的事情 di
  • 如何在 gulp.src 中使用基本正则表达式?

    我正在尝试选择两个文件gulp src highcharts js and highcharts src js 当然 我知道我可以使用数组表达式显式添加这两个表达式 但出于学习目的 我尝试为它们编写一个表达式 我读过可以使用简单的正则表达式
  • HTML 默认图像大小

    我在我的代码上显示 3 张图片 图片具有不同的尺寸 宽度和高度 div class row div class col lg 12 h2 class page header Gallery h2 div div class col md 4
  • 单击列表时使用 bootstrap Dropdown 防止下拉菜单消失

    我正在使用使用引导下拉菜单 http twitter github com bootstrap javascript html dropdowns生成下拉菜单 我想防止点击菜单时菜单消失 我已经实现了以下代码 但它不起作用 知道如何修复它吗

随机推荐

  • 使用 AssetsLibrary 框架 iPhone 访问库中的视频?

    我正在尝试在以下代码的帮助下使用 AssetsLibrary Framework 访问 iPhone 库中的视频 但是当我运行应用程序时 代码不起作用 数组资产仍然为空 我究竟做错了什么 顺便说一句 我的 iPhone 是 3G 升级到 i
  • 将文本添加到另一个程序文本框 C++

    我已经成功地将文本发送到我使用 C 创建的自定义文本框 以及记事本 计算器和其他程序 所有这些程序都带有 1 个窗口和 1 个文本框 但是 我想将文本发送到另一个具有多个文本框并且也在选项卡中的程序 它的结构如下 开放程序 从 2 个选项卡
  • 如何返回使用 malloc 分配的指针的大小?

    看这个例子 int main int argc char argv int ptr malloc 100 sizeof int printf sizeof array is d bytes n sizeof ptr printf 函数只返回
  • 使用drive.file范围执行查询时出现错误500

    此代码在 https www googleapis com auth drive 范围内运行良好 File folderEntry drive files get XXXXj0 srDPPGUEtHaVYtZFljMEk execute S
  • 如何在 Dymola (Modelica) 中使用 /bigobj 进行编译

    我正在将一个相对较小的有限元 FE 模型集成到 Modelica 中 为此 我创建了一个模型 Modelica 类 它可以读取 Matlab 二进制文件格式的质量 M 和刚度 K 矩阵 我将 FE 模型与 Modelica 标准库 Mode
  • 开始 iPhone 开发

    我是那种通常通过实践来学习的人 我有一个应用程序的想法 但我很矛盾 如果我应该开始开发 当我遇到一些东西时 只需在我的书 流行的 apress 葡萄柚书 中查找它 或者只是先通读这本书 了解基础知识 有什么建议么 我已经读完第五章了 你们都
  • 如何在QT(QGraphicsView)中打开svg文件

    如何打开 svg 文件 如 png 文件 例如它适用于 png 文件 scene new QGraphicsScene QRect 10 10 680 520 view new QGraphicsView this image new QG
  • 使用 jquery 从表中获取值作为键值对

    我有一张桌子 table class datatable caption hospitalization rates test caption thead tr th Funding Source th th Alameda County
  • 在Delphi中初始化单元之前添加代码

    是否有地方可以添加将在单元初始化之前执行的代码 我想这样做的原因是我需要更改 DecimalSeparator 这必须在某些单元初始化之前完成 我已将其放在 Application Initialize 之前的项目源中 但那时为时已晚 在我
  • Laravel 5.3 + MongoDB 库“jenssegers/laravel-mongodb”中的 hasMany 关系问题

    我在用MongoDB图书馆在Laravel 5 3 我有两个收藏MongoDB我想做一个hasMany他们之间的关系 MongoDB 第一个收藏 Employee id ObjectId 586ca8c71a72cb07a681566d e
  • ES查询匹配数组中的所有元素

    所以我得到了这份文件 我想用此查询过滤的嵌套数组 我希望 ES 返回所有项目都有更改 0 的所有文档 仅此而已 如果文档列表中只有一个项目的更改 1 则该项目将被丢弃 有什么方法可以从我已经编写的查询开始实现这一点吗 或者我应该使用脚本来代
  • 从android webview调用javascript函数?

    我尝试直接从我的应用程序 webview apk 调用一个javascript函数 为了启动一个自动播放html5视频剪辑的脚本 我尝试在webview loadURL之后添加itt 但没有运气 也许有人可以看一下代码 我缺少什么 谢谢 p
  • Discord.js 查找频道时出现问题

    我正在尝试发出验证命令 但我一直卡在机器人上 提示 请输入有效频道 即使有有效的频道名称 let channel message mentions channels first message guild channels cache ge
  • Jackson Json 序列化:排除与登录用户角色有关的属性

    如果登录用户无权查看特定字段 是否有任何方法可以动态排除 bean 属性被序列化 例如 如果 bean 具有字段 A B C 则在 REST 响应中 管理员可以看到字段 A B C 而简单用户只能看到字段 A B 我如何注释字段 C 的 g
  • 从 SDC 卡上的图像设置壁纸

    如何从 SD 卡上的图像设置主屏幕壁纸 i e try wallpaperManager setResource sdcard wallpaper olive jpg finish catch IOException e e printSt
  • 真实图像视图之外的“不可见”可触摸区域

    所以我很久以来就遇到了这个问题 我什至提交了Apple TSI 但还没有得到答案 简而言之 我给视图中的图像指定了一定的高度和宽度 因为我希望比例保持相似 所以它应该放大 这是可行的 但是现在 当初始图像放大以适应可用空间的宽度时 图像的其
  • Ruby 是否提供了constant_added 钩子方法?

    我知道 Ruby 提供了几种有用的钩子方法 但是 我似乎找不到类似 constant added 钩 我想要一个的原因是因为我希望重写它 以便每当添加常量时 都会执行与更新某些变量有关的某些其他操作 而不必自己调用某种更新方法 更具体地说
  • iPhone 开发 - 手动旋转视图

    如何使用 autoresizingMasks 手动旋转视图 就好像用户旋转了手机并且它已自动旋转一样 我也希望它是即时的 没有动画 我你想知道为什么我需要这个 看看我的其他问题iPhone Dev 保持界面旋转 Thanks 您想要在这里做
  • Swift 中的模块是什么意思?

    例如 我有两个文件 名为file1 swift and file2 swift file1 swift import UIKit class A B file2 swift import UIKit class C A 我读到公共类不能在模
  • JavaScript 碰撞检测系统不会忽略被阻止的碰撞

    我在使用迷你游戏开发过程中遇到问题EaselJS我的碰撞检测系统 我需要有人的帮助 当英雄 圆形位图 碰撞一个对象并且第一个对象后面有其他对象时 英雄会与两个对象碰撞 即使第二次碰撞被阻止 也会出现此问题 这是一个图像解释 问题的原因非常简