转载自:http://www.9ria.com/news/2011/0714/23330.html
向你展示了我的video of my work in progress engine后,是时候教你用Box2D ver2.1来实现对象切割了
内容比较多,废话少说,马上开始
绘制激光刀
绘制激光飞船简单,它是成千上万个绘画游戏中的一个古老的话题“按下鼠标、移动鼠标、释放鼠标”。
当玩家按下鼠标时,从起点到当前鼠标位置绘制一条线段,表示激光线,当玩家松开鼠标时,显示最终的激光。
也就是说激光有两个端点:起点和终点。这些点存放在b2Segment变量中。当然变量名没有定性的要求,但是既然Box2D为我定义好了segment,为什么不用呢?
下面是代码:
我们来看一下用到的变量
worldScale:用来将Box2D中的“米”转换为像素,如果你对Box2D中的米还很陌生的话,请点击这里,在我们这个例子中1米表示30像素
canvas:用来绘制激光的画布
laserSegment:b2Segment类变量用来存储激光的起点和终点。
drawing:表示玩家是否正在绘画的一个布尔值变量
然后建立三个鼠标事件侦听器:一个是鼠标按下、一个是鼠标移动、另一个是鼠标弹起。
鼠标按下时:将drawing设置为true,因为实际我们已经开始绘制了,创建一个新的b2Segment实例,同时将它的p1属性(起点)设置为一个新的b2Vec2变量(可以理解为Flash的point对象),该属性的作用是将当前的鼠标坐标转换为Box2D单位。
当鼠标移动时:首先检查是否正在绘画过程中,然后从起点(laserSegment的p1属性)到鼠标当前位置绘制一个激光(一条细长的红线)。
当鼠标弹起时:首先将drawing设置为false,因为我们已经停止绘制了,将p2属性(终点)设置为一个新的b2Vec2变量,存储转换为Box2D单位的鼠标坐标,这一点跟“鼠标按下”里的处理是一样的。
现在,你可以用鼠标绘制激光了,测试一下:
http://www.emanueleferonato.com/wp-content/uploads/2011/06/Laser.swf
点击并拖动鼠标绘制激光。
现在我们需要一些用来切割的东西。
添加对象
下面我要创建三个静止的元素:floor、box、circle。这一步中,我们只是添加对象,所有你可能会觉得有点无聊,但是我希望你能注意依稀我创建circle的方法:因为Box2D本身并不只是弧线,所以我用12个端点绘制了一个近似circle的多边形。当然你可以用24或36个端点来实现更好的效果,我用的端点比较少,是出于方便理解的考虑的。在日常的项目工作中,我都是用36个顶点来绘制多边形的。
目前的代码如下:
现在要为laserFired方法添加功能,绘制一个红色的圆圈,这样我们可以清楚的看到切入点。
结果如下:
http://www.emanueleferonato.com/wp-content/uploads/2011/06/Laser2.swf绘制一个激光,让它穿过一个或多个对象,产看切入点位置的红色圆圈。现在我们要找到切出点。
因为RayCast方法只是实现激光的发生,而无法模拟激光穿过对象,所以Box2D无法找到切出点的位置。
好的,谢谢您的阅读。运行结果如下:
http://www.emanueleferonato.com/wp-content/uploads/2011/06/Laser3.swf
绘制一条激光,让它穿过一个或这个更多的对象,看一下切入点和切出点效果。
以上是本文的全部内容。下次,我会继续讨论更多关于切割对象的内容。