我正在编写一个侧视网球游戏,灵感来自一个古老的街机游戏,使用Javscript和HTML5画布元素。球员可以左右移动,并保持球拍的手臂长度,可以旋转360度围绕肩关节。
我很高兴碰撞检测和由此产生的偏转角在球拍和球的情况下,球员站立不动,球拍不动。我使用光线投射的方法来检测球拍的矢量和球拍的轨迹向量之间的碰撞,作为建议在此。
但是,我很难实现旋转球拍和球之间的碰撞检测。当球拍被摆动时,碰撞所适用的区域具有类似圆形部分的形状,但球拍旋转到快速,碰撞检测在大多数情况下不会捡起它。下面的图片说明了这个问题,红色箭头表示摆动球拍的方向。
下面来自player实体的update函数的代码片段显示了如何更新球拍。arcmx
和armcy
是肩关节的位置,rstart_
和rend_
是球拍的开始和结束。
if(KEY_STATUS.rleft || KEY_STATUS.rright) {
if(KEY_STATUS.rright) {
this.rangle += this.rspeed;
} else if (KEY_STATUS.rleft) {
this.rangle -= this.rspeed;
}
}
this.armcx = this.x + this.width/2;
this.armcy = this.y + 46;
this.rstartx = this.armcx + Math.cos(this.rangle)*40;
this.rstarty = this.armcy + Math.sin(this.rangle)*40;
this.rendx = this.armcx + Math.cos(this.rangle)*71;
this.rendy = this.armcy + Math.sin(this.rangle)*71;
我在这个问题上非常迷茫,并且很感激关于如何处理它的任何提示。
发布于 2014-07-07 13:57:34
基本上,你做球拍/球碰撞测试在足够频繁的时间间隔之间的帧,以使球不能通过球拍而没有碰撞被检测到。这给出了碰撞何时发生的粗略估计,在此之后,您可以开始细分您的时间步骤,以找到确切的接触时刻(您越精确地想要它,您就越细分)。这应确保正确地检测到冲突,并保持一致。
发布于 2014-07-07 13:29:50
你可以做的是给球拍一个固定的“范围”,也就是每更新一次球移动的距离的一半。这样,球就永远不会穿过球拍。这当然会导致轻微的不一致与球的篮板球轨迹,但你必须测试出来,以确定他们的实际效果。
是的,球拍的逻辑大小会动态变化,但这是我能想到的正确判断球何时击中球拍的最佳方法,而不会妨碍球拍的表现。
虽然你可以移动球和球拍,每一次更新几次,然后在每次移动后检查。这似乎有点乏味,可能在硬件上有点困难,这取决于运行游戏的系统,但它可能是最准确的。
我这样做是为了我自己的一场比赛,我必须检查一个气球是否触到了尖顶,而不是边线,所以这是一个有效的方法,尽管它可能会被微调一点,以适应你的游戏。
https://gamedev.stackexchange.com/questions/79909
复制相似问题