- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在此codePen demo你可以用箭头移动“玩家”正方形,放置一个有空间的灯,并且应该被推到相反的方向而停止从任何方向越过蓝线。 “玩家”使用 x 和 y 速度变量来创建运动,如果检测到碰撞,则将它们乘以 -1(+ 某个值)。
问题是,在被推离墙壁后,“玩家”被卡在一个只能从墙壁向后移动的位置,同时看起来卡在垂直轴上。 (例如 - 如果墙在玩家的顶部,你只能移动到底部,而不是在撞到墙后向左或向右移动)
从理论上讲,我想要一个平滑的滑动碰撞检测,卡在墙上的玩家会慢慢地向左或向右滑动 取决于是否按下左箭头或右箭头。 (四处玩耍我能够实现这一点,但总是一个方向会“流动”,使玩家向某个方向滑动)
我考虑过使用射线或其他一些方法来检测命中,但它们似乎需要比只是简单的方法。将不胜感激构建可扩展碰撞检测的任何输入和任何建议,这是我在演示中进行移动和碰撞检测的基本代码:
let xVelocity = 0;
let yVelocity = 0;
var blockedMapGrid = [[0,30],[0,50],[0,100],[0,150],[0,200],[0,250],
[50,0],[100,0],[150,0],[200,0],[250,0],[300,0]];
var animate = function() {
if (keyState[37]) {
xVelocity -= 1;
}
if (keyState[38]) {
yVelocity += 1;
}
if (keyState[39]) {
xVelocity += 1;
}
if (keyState[40]) {
yVelocity -= 1;
}
for (var i = 0; i < blockedMapGrid.length; i++) {
if (Math.abs(player.position.x - blockedMapGrid[i][0]) +
Math.abs(player.position.y - blockedMapGrid[i][1]) < 36) {
xVelocity = -xVelocity * 1.2;
yVelocity = -yVelocity * 1.2;
console.log("Blocked by " + blockedMapGrid[i][0])
};
}
player.position.x = player.position.x + xVelocity;
player.position.y = player.position.y + yVelocity;
yVelocity *= 0.80;
xVelocity *= 0.80;
camera.position.x = player.position.x;
camera.position.y = player.position.y;
requestAnimationFrame(animate);
renderer.render(scene, camera);
};
最佳答案
你的检测器的这部分是错误的:
Math.abs(player.position.x - blockedMapGrid[i][0]) +
Math.abs(player.position.y - blockedMapGrid[i][1]) < 36
基本上,在这里,您通过使用添加的绝对值而不是平方和的根来估算从玩家到网格上的点的距离。事实上,您不需要如此复杂的网格(重复线)和距离。
您似乎在进行轴对齐边界框 (AABB) 检测。有 plenty的 resources在互联网上如何优化它。
但一般的做法是这样的。您的网格阵列应由带有 (x,y,w,h)
的框组成措施。可以是细的,长的,方形的,任何东西。我们还假设您的玩家有一个边界框 (player.x, player.y, player.w, player.h)
, 然后
for (var i = 0; i < grid.length; i++) {
if (player.x < grid[i].x + grid[i].w &&
player.x + player.w > grid[i].x &&
player.y < grid[i].y + grid[i].h &&
player.y + player.h > grid[i].y) {
//collision detected! move player to previous known position
break;
}
}
您可以改变检测到碰撞时的操作,但使用 4 个条件判断两个框是否重叠是这里的关键。
更新
问题中的代码引起的另一个问题是检测到碰撞后“弹跳”或“卡住”。
根据经验,永远不要使用 velocity = -velocity
碰撞后也没有确保 Angular 色回到“清晰”状态,即玩家的边界框没有与任何障碍物重叠。否则你将陷入无限循环 collision? -> vel = -vel, pos += vel*t -> collision -> ...
速度从负向正向反弹,并且不允许玩家离开墙。
修复它的最简单方法是首先在临时变量中计算玩家的新位置,检查新位置是否没有碰撞,然后才将其永久化并调用 render()
,否则只需忽略它并在不移动播放器的情况下进行渲染。
另一种方法是记住最后一个已知的“好”位置,并且只在 Angular 色返回到之前的位置时才交还对 Angular 色的控制权,可能是在动画或一系列无法控制的 Action 之后。
还有更复杂的方法,主要涉及某种物理模拟,让 Angular 色在多个障碍物之间弹跳,前提是控制输入不能克服惯性——想想一辆汽车在湿滑的道路上行驶,或者一艘船撞到多棵树上。但无论哪种方式,在检测到碰撞之后和调用“render()”之前,您都必须将 Angular 色放置在物理上可能的位置,否则它将著名地“卡在纹理中”。
关于javascript - 修复基于速度的二维运动的简单碰撞检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54815264/
我在想出一个算法时遇到了麻烦... 我有一系列 GPS 数据,以 1 秒为间隔记录时间、速度、距离。假设距离是米,速度是米/秒。可能有超过 2 小时的数据,或 7200 个点。这里的“时间”字段主要是
使用java排序器,即: Collections.sort(myArrayList, new Comparator() { @Override public int c
有什么区别吗 SELECT * FROM my_table 和 SELECT my_column_id FROM my_table 地点: my_table 有百万行 网站上有大量并发用户进行sql查
有2个样本。 在第一个示例中,使用 orderby 可以更快地获得结果。 (根据 phpmyadmin 速度报告) 在另一个例子中,我没有使用 order by,它给出的结果较慢。 (根据 phpmy
我注意到,如果我将训练数据加载到内存中并将其作为 numpy 数组提供到图中,与使用相同大小的 shuffle 批次相比,速度会有很大差异,我的数据有大约 1000 个实例。 使用内存 1000 次迭
我在 python 中使用破折号。我正在绘制记录到 SQLite 数据库中的实时数据,目前,我正在绘制单个值与时间线图。我计划再添加 20 个图表,但目前,随着时间的增加, plotly 变慢,我认为
我试图调用 hasNext Velocity 模板中的方法,以便根据 foreach 循环中的位置影响行为 - 仅 hasNext没有按照文档工作。 这是 Velocity 用户指南的片段,关于 ha
在我正在制作的游戏中,我有两个点,pt1 和 pt2,我想计算出它们之间的角度。我已经在较早的计算中计算出距离。显而易见的方法是对垂直距离上的水平距离进行反正切 (tan(theta) = opp/a
我经常遇到字符串值不存在和/或为空的情况。这是测试这种情况的最佳方法吗? #if( $incentive.disclaimer && $!incentive.disclaimer != '' )
我想将一个模板nested包含在其他模板cont1,cont2和cont3中。 并且嵌套模板应仅对cont1隐藏一个特定控件。 在包含在cont1中之前,我想为一些标志变量$hideMyControl
是否可以更改从“Windows Azure Media Encoder”输出的音频的播放速度? 我正在使用配置为“WMA High Quality Audio”的“Windows Azure Medi
我使用速度将String(template)与字段合并 hi there I'am ${name}, And I'am ${age} old. velocity将字段${name}和${age}与一种
我使用的是 LockedBitmap 类,它简化了 C# 中位图数据的处理。目前它正在将数据复制到本地 byte[] 数组中,然后通过其类方法访问该数组以获取/设置像素颜色值。 这比直接通过指针访问锁
我尝试在 VM_global_library.vm 文件中添加一堆 #set($x=abc) 语句,但这些变量在我的 VM 模板中不可用。 我想为图像的基本路径等设置一个全局变量。这可能吗? 最佳答案
我的项目结构: -src --main ---java ----makers -----SomeClass ---resources ----htmlPattern.vm 如何告诉 SomeClass
我正在尝试从 Velocity 中的字符串中删除不需要的字符(换行符可以,但不能像 EM 和 CAN ASCII 控制字符那样)。 #set($cleanScreen = $cleanScreen.r
我想在日.月.年之间的点处分割日期。例如:2015 年 1 月 14 日至 {14, 01, 2015}这是我使用的代码:dates3.get(0) 包含我从页面的文本字段获取的字符串“14.01.2
之后,从 1.5 升级到速度引擎 1.7 出现了 1.5 没有的问题。为了解释这个问题,我必须展示一个代码片段: #foreach($someVariable in $someCollection)
我想知道从表中选择所有字段是否更快: SELECT * 或只选择您真正需要的: SELECT field1, field2, field3, field4, field5... 假设表有大约 10 个
我正在尝试模仿照片应用程序的行为,在该应用程序中,用户用手指平移照片并且照片具有一定的速度。由于我不会深入的原因,我不能将 UIScrollView 与它的缩放 UIImageView 一起使用,而是
我是一名优秀的程序员,十分优秀!