我创建了一个碰撞类来使用像素检测碰撞。在我的课堂上,我还开发了一些用于确定碰撞角度的函数。基于此,我创建了一些示例:
http://megaswf.com/serve/25437/
http://megaswf.com/serve/25436/
(改变重力的空间,右/左给球一些速度。)
您可能会注意到,会发生一些奇怪的事情:
- 当球速很低时
- 当球的方向几乎与障碍物相切时。
碰撞 http://img514.imageshack.us/img514/4059/colisao.png
上图显示了我如何计算碰撞角度。我称红点为关键点。我搜索最大数量的关键点(通常为 4 个)。如果我发现超过 2 个关键点,我选择最远的 2 个(如蓝色对象之一所示)。这就是我如何找到物体碰撞表面位置的法线角度。我不知道这是否是一种过时的做事方式。
基于该角度,我旋转速度矢量来进行弹跳。
进行数学运算的代码如下:
static public function newSpeedVector(speedX: Number, speedY: Number, normalAngle: Number): Object{
var vector_angle: Number = Math.atan2(speedY, speedX) * (180/Math.PI);
var rotating_angle: Number = (2*(normalAngle - vector_angle) + 180) % 360;
var cos_ang: Number = Math.cos(rotating_angle/DEGREES_OF_1RAD);
var sin_ang: Number = Math.sin(rotating_angle/DEGREES_OF_1RAD);
var final_speedX: Number = speedX * cos_ang - speedY * sin_ang;
var final_speedY: Number = speedX * sin_ang + speedY * cos_ang;
return {x_speed: final_speedX, y_speed: final_speedY};
}
这就是计算新速度矢量的方式......
我的问题是,有没有人遇到过这种问题,或者对如何避免这种情况有一些想法?