目前我正在研究2D粒子模拟器。我让每个粒子都以独特的角度移动。我找到了一个改变x和y速度的基本公式,但我现在有一个根据角度移动的设定速度。
particles[a][3] += particles[a][1] * cos(radians(particles[a][5]));//move X
particles[a][4] += particles[a][1] * sin(radians(particles[a][5]));//move Y
我对墙壁上的碰撞进行了基本碰撞,但无法找到排除碰撞的最佳方法。目前我只是将旋转乘以-1,但这只适用于顶部和底部。注意:运行碰撞后粒子将始终移动(它不会卡在碰撞盒中并且不会出现问题)。
if(particles[a][3] < 0 || particles[a][3] > windowWidth/2 || particles[a][4] < 0 || particles[a][4] > windowHeight/2) {
/*windowWidth and windowHeight are divided by 2 to find the canvas size. In the setup() I have the canvas set to that value).*/
particles[a][5] *= -1;
}
数组值:
particles[a][1] = speed
particles[a][3] = x position
particles[a][4] = y position
particles[a][5] = rotation
我的问题是运行这些碰撞测试的最佳方法是什么。我知道碰撞会在90度反弹,但是我想尽可能少地使用if语句(越简单越好),而不是单调乏味。
圣诞快乐,并提前感谢!
想出来! 最终代码:
if(particles[a][4] < 0 || particles[a][4] > windowHeight/2) {
particles[a][5] *= -1;
} else if(particles[a][3] < 0 || particles[a][3] > windowWidth/2) {
particles[a][5] = 180 - particles[a][5];
}
答案 0 :(得分:0)
尝试谷歌搜索“javascript反射角度”,你会找到用于反射X轴和Y轴的公式。当你与顶部或底部碰撞时,你会做一个,而当你向左或向右碰撞时,你会做另一个。
此外,您可能不应该使用数组来保存数据。创建一个包含值的类,然后创建该类的实例。使用魔术数组索引是令人头疼的问题。
如果仍然无法使其正常运行,请发布MCVE,我们将从那里开始。祝你好运。