PI/180);
point4.y = -length*Math.sin((270-(mc.rotation+dtAngle))*Math.PI/180);
hitTestPoint检测的是一个全局坐标和某剪辑的碰撞 使用mc的localToGlobal方法获得点的全局坐标 之后即可检测其与碰撞区是否碰撞。 此方法优点在于能较清楚地知道剪辑究竟哪里与外界碰撞。 例如,一台汽车与房子碰撞,我们检测到了一辆前进的车碰撞点是车的左前,那么可以在这个点播放一个“碰撞火花动画”并根据这个碰撞作出车应该被动向右转向和减速的判断。 上例给了车4个碰撞点。碰撞点越多,对这次碰撞的描述越清晰。 如果同时有两个以上的点发生碰撞,取其中点作为这次碰撞的实际发生点。 例如此方块向箭头方向运动,红点和绿点同时检测到碰撞,可以认为是此方块前方正中发生了碰撞,并作出方块直接速度反向并在前方正中播放碰撞火花动画的判定。
4.3 游戏->俯视->不限定移动->函数描述 特点:障碍物形状未必相同,但是规则的几何图形,或者能近似考虑成几何图形,注册点严谨在几何中心,总数量较少。或项目出现难以用点描述的情况。 举例:台球为代表的球类平面游戏,停车场等要求非常精准碰撞的游戏 停车场虽然用BitmapData/hitTest也可以制作,但是找不到碰撞点,不如后面方法。 此类碰撞不使用flash自带的碰撞接口,使用的是高中数学知识。
首先定义几个基础类: Line //线段类,属性有a,b,c,P1,P2,其中P1,P2为端点,线段上的坐标为(x,y)的点满足a*x+b*y+c==0 Box //矩形,属性有P1,P2,P3,P4即四个顶点,get方法能得到任意两点间的线段L12,L23,L34,L41: Line Ball //圆形,属性有x,y,r,即圆心横、纵坐标,半径 最长应用的数学公式如下: 点之间距离公式(勾股):Math.sqrt((P1.x-P2.x)*(P1.x-P2.x)+(P1.y-P2.y)*(P1.y-P2.y)) 点到直线距离公式:Math.abs(a*x+b*y+c)/Math.sqrt(a*a+b*b); 线段联立方程://求解过程略 a1*x+b1*y+c1 == 0; a2*x+b2*y+c2 == 0; 过后补出AS3.0类
我们可以通过检测方程联立解是否在线段上判断两条线段碰撞。 可以用圆心距离是否小于半径和判断两个圆形碰撞。 可以用圆心到直线距离是否小于圆半径判断球和直线的碰撞 可以综合分析四条边分别有无碰撞,以及是否出现一个矩形包含另一个,来判定两个矩形的碰撞 上述检测方法都能将具体碰撞的位置求出
试举一个用函数碰撞优化的例子: 此图中,玩家的炮台发射了一道长度1000的直激光。敌人有3个,要检测是否命中敌人。 hitTestObject首先被排除掉了,理由略。
接着排除的是B |