想问问uu们为什么代码运行结果跟预期效果不一样
javascript吧
全部回复
仅看楼主
level 4
大鼠~ 楼主
我想用canvas绘图实现一个圆在长方形内不断运动不断发生弹性碰撞的效果。
在draw函数中,我引入了重力加速度gravity,此外就是模拟弹性碰撞。
如果我不引入gravity,则圆会保持速度大小不变不停地运动。
但是在我引入gravity之后,并不是像我预期的那样(圆不停地做抛体运动,并且每次弹起的最大高度相同),而是每次弹起的最大高度越来越低,最后变成零,并且如果我不加上红框里的代码,圆形甚至会在canvas里消失(类似于运动到了canvas的外面)
想问一下uu们,这种情况是为什么?
2023年04月30日 08点04分 1
level 7
把代码给 AI 逐条给解释比较有效率- -
2023年05月01日 09点05分 3
level 12
红框里的代码是为了限制circle纵坐标不会超出画板。
你circle应该是在外部定义的一个对象对吧?
你每次绘制都在改变circle对象的加速度,而没有重置。
2023年05月04日 01点05分 4
dy是竖直速度,gravity是一个常数,这样不是circle的竖直加速度恒定吗
2023年05月06日 03点05分
@大鼠~ 问题是你 circle.dy += gravity 就是在不断改变dy的值啊。。。这样你每绘制一次,circle.dy 都会不断增加。
2023年05月06日 07点05分
@原来是禽兽灬 要的就是这种效果嘛
2023年05月06日 09点05分
level 12
我大概看了一下,你在circle.dy += gravity 加个判断。
if(circle.dy < 0) {
circle.dy -= gravity
} else {
circle.dy += gravity
}
2023年05月06日 08点05分 5
不是这样的,我刚刚想了想,已经修复了,原因在于在每一帧判断碰撞时可能此时小球已经处于墙外(有一个多出的距离),但是计算下一帧时忽略了这段多出的距离,导致小球高度越来越低。不过还是谢谢老哥热情的回复啦!
2023年05月06日 09点05分
level 13
你在球接触底部的时候只是将它的速度反向了,并没有计算球在接触底部这一刻马上要回弹的高度,导致球每次碰到底部都会损失一部分位移,你红框中的代码仅仅只是保证球不会移动到空间外部罢了,并没有解决根本的问题。
2023年05月06日 19点05分 6
确实,已经解决了,谢谢uu
2023年05月07日 14点05分
1