用Nape制作智商球模型
智商球也是一个基于物理引擎的益智类游戏,玩家通过点击舞台,可以创建一个关节,游戏主角会在这个关节的牵引下向这个方向移动,如下图所示。今天我们学习用Nape的PivotJoint关节来制作一个《智商球》(Catch the candy)模型。
其实呢,这个效果我们并不陌生,在PivotJoitn关节实现鼠标关节时,当鼠标快速移动时,鼠标位置与刚体之间就会出现类似的牵引效果。
原理上也很简单,创建一个PivotJoint关节,设置关节连接刚体一个是目标刚体,另一个是Space.world刚体(这是一个空刚体,我在PivotJoitn关节实现鼠标关节里曾讲过),设置节点anchor为目标刚体的坐标。
在实现鼠标拖动效果是,我们在鼠标移动事件处理函数中,更新节点anchor的坐标,这个更新频率是很高的,所以我看到的牵引效果并不明显。
在<智商球>游戏里,玩家是通过点击鼠标实现的牵引,所以要实现类似的效果,我们只要把MOUSE_MOVE事件处理函数中的代码,翻到MOUSE_DOWN事件处理函数就可以了。效果如下,点击舞台任意位置,开始牵引。
[swfobject]907[/swfobject]
完整的代码如下:
package learnNape { import flash.events.MouseEvent; import nape.geom.Vec2; import nape.constraint.PivotJoint; import ldEasyNape.LDEasyNape; import nape.phys.Body; import learnNape.AbstractNapeTest; /** * @author yangfei */ public class T26_PivotJointAnotherUsage extends AbstractNapeTest { public function T26_PivotJointAnotherUsage(gravity : Number = 600) { super(gravity); } private var body: Body; private var joint : PivotJoint; override protected function onNapeWorldReady() : void { //创建目标刚体 body = LDEasyNape.createCircle(275, 200, 30); //实例化牵引关节 joint = new PivotJoint(napeWorld.world, body, Vec2.weak(), Vec2.weak()); //设置关节是否有弹性,stiff为true表示没有弹性,false是有弹性 joint.stiff = false; joint.active= false; //限制关节的牵引力,最大为1000*body.gravMass。默认是无穷大,这样目标对象会瞬间移动至鼠标位置 joint.maxForce = 1000 * body.gravMass; joint.space = napeWorld; } override protected function mouseEventHanlder(event : MouseEvent) : void { super.mouseEventHanlder(event); if(event.type == MouseEvent.MOUSE_DOWN){ ///鼠标点击时,更新关节节点anchor joint.anchor1 = Vec2.weak(mouseX,mouseY); joint.active = true; }else if(event.type == MouseEvent.MOUSE_UP){ joint.active= false; } } } }
代码中有几点要特别注意:
- 设置关节的stiff属性。stiff表示关节是否有弹性,stiff为true表示没有弹性,false是有弹性。如果关节没有弹性,目标刚体会突然更新到目标位置。
- 限制关节的最大牵引力maxForce属性。关节的牵引力用maxForce属性表示,默认是无穷大,这样目标对象会瞬间移动至鼠标位置,这是我们不希望看到的,所以要设置maxForce属性,加以限制。
代码中用到了LDEasyNape,如果你不会用请参考这里。
点击下载完整的源文件
联系作者
智慧的分享!