Nape 获取碰撞点加特效

package  {
    import nape.phys.Body;
    import nape.shape.Shape;
    import nape.shape.Circle;
    import flash.display.MovieClip;
    import flash.utils.getDefinitionByName;
    import nape.callbacks.CbType;
    import nape.callbacks.PreListener;
    import nape.callbacks.InteractionType;
    import nape.callbacks.PreCallback;
    import nape.dynamics.CollisionArbiter;
    import nape.geom.Vec2;
    import nape.callbacks.InteractionListener;
    import nape.callbacks.CbEvent;
    import nape.callbacks.InteractionCallback;
    import nape.phys.BodyType;
    import nape.shape.Polygon;
    import nape.dynamics.Contact;
    import nape.dynamics.ContactList;

    public class Main extends BaseMain {

        public function Main() {
            super({gravity:{x:0,y:0}});
        }

        private var _cCbType:CbType=new CbType();
        private var _rCbType:CbType=new CbType();
        override protected function createBodies():void {
            //一些用于碰撞的刚体
            for(var i:int=0;i<20;i++){
                var b:Body;
                if(Math.random()>0.5)b=createBox(50,2,stage.stageWidth*Math.random(),stage.stageHeight*Math.random());
                else b=createCircle(25,stage.stageWidth*Math.random(),stage.stageHeight*Math.random());
                b.rotation = 2*Math.PI*Math.random();
                b.type = BodyType.STATIC;
                b.space = _space;
            }

            //圆形
            var c:Body = createCircle(20,stage.stageWidth>>1,stage.stageHeight>>1);
            c.cbTypes.add(_cCbType);
            c.space = _space;
            c.velocity.setxy(500,500);
            _space.listeners.add(new InteractionListener(CbEvent.BEGIN,InteractionType.COLLISION,_cCbType,CbType.ANY_BODY,circleHitBeginHandler));

            //矩形
            var r:Body = createBox(40,40,stage.stageWidth>>1-100,stage.stageHeight>>1);
            r.cbTypes.add(_rCbType);
            r.space = _space;
            r.velocity.setxy(-500,-500);
            _space.listeners.add(new InteractionListener(CbEvent.BEGIN,InteractionType.COLLISION,_rCbType,CbType.ANY_BODY,boxHitBeginHandler));
        }

        private function circleHitBeginHandler(cb:InteractionCallback):void{
            var colArb:CollisionArbiter = cb.arbiters.length>0?cb.arbiters.at(0) as CollisionArbiter:null;
            if(!colArb)return;
            //trace("圆形碰撞点数:"+colArb.contacts.length);//始终只有一个碰撞点
            var hitPos:Vec2 = colArb.contacts.at(0).position;
            addEffect(hitPos.x,hitPos.y);
            //反弹
            var normal:Vec2 = colArb.normal;
            cb.int1.castBody.velocity.set(normal.mul(500));
        }

        private function boxHitBeginHandler(cb:InteractionCallback):void{
            var colArb:CollisionArbiter = cb.arbiters.length>0?cb.arbiters.at(0) as CollisionArbiter:null;
            if(!colArb)return;
            //trace("矩形碰撞点数:"+colArb.contacts.length);//会出现多个碰撞点
            var shape2:nape.shape.Shape = colArb.shape2.body == cb.int2.castBody?colArb.shape2:colArb.shape1;
            //查找出真正碰撞的点
            var contact:Contact = getHitShapeContact(colArb.contacts,shape2);
            if(contact){
                var hitPos:Vec2 = contact.position;
                if(hitPos) addEffect(hitPos.x,hitPos.y);
            }
            //反弹
            var normal:Vec2 = colArb.normal;
            cb.int1.castBody.velocity.set(normal.mul(500));
        }

        private function getHitShapeContact(contacts:ContactList,shape:nape.shape.Shape):Contact{
            var i:int = contacts.length;
            while(--i>=0){
                if(shape.contains(contacts.at(i).position))return contacts.at(i);
            }
            return null;
        }

        private function addEffect(x:Number,y:Number):void{
            var _Class:Class = flash.utils.getDefinitionByName("Effect") as Class;
            var eff:MovieClip = (new _Class()) as MovieClip;
            eff.x = x;
            eff.y = y;
            this.addChild(eff);
        }
    }

}

源码下载地址:

http://yunpan.cn/cd8GasJG5rkUp  访问密码 6873

时间: 2024-11-08 21:37:08

Nape 获取碰撞点加特效的相关文章

unity导弹算法 预计目标点

关于导弹的飞行算法,网上有很多教程.简单算法无非是获取目标点的当前位置,然后导弹朝目标方向移动.高深点的,就是通过计算获取碰撞点然后朝着目标移动.如果你能看懂这个高深算法的话,可以去看原帖:http://game.ceeger.com/forum/read.php?tid=3919 需要注意的是,原帖存在错误.而且一些方法使用的不合理.下面是我整合后的代码,欢迎大家提出不同见解. 想要实现导弹的“拦截”功能,首先需要根据目标物体的速度,位置,导弹的速度,位置,计算出两者相交的预计点.然后导弹朝碰

unity中让物体移动到鼠标点击位置(单击移动和双击暂停移动)

private bool IsMove;//移动 //鼠标双击的参数(第一种方式的参数) private float delay = 0.5f; private float firstClickTime = 0; private bool oneClick = false; //点击了第一下 //双击(第二种方式的参数) private float endtime = 0; private float Doubletime = 0.5f; //响应时间 public void Start(Gam

unity学习--003:角色控制器

今天研究模型控制器,探寻下怎么实现基本的控制模型方法 首先,我随便拉了几个小模型 这就是猪脚了.先添加常用的前后左右,就是WSAD,按wsad就使角色的transform组件变化下位置, private float MoveSpeed = 3f; void Start() { } void Update() { if(Input.GetKey(KeyCode.A)) { //改变角色X轴 transform.Translate(Vector3.right * -MoveSpeed * Time.

Vega Prime核心功能模块介绍

Vega Prime具有典型面向对象特点,其核心功能模块都是以类的形式定义的,并存在一定的继承关系,对基本功能进行扩充. vp***表示vp模块中的函数和类,这一层完全可以由Lynx Prime来操作完成: vs***表示vsg模块中的函数和类,是vp的关键核心: vr***表示render层,是硬件接口层,可以理解为对OpenGL或DirectX的封装层: vu***表示一些内存管理.辅助.数学.工具类,对vega prime的其它功能进行了完善. 1.内核vpKernel vpKernel继

unity3d 数学的数学基础和辅助类

转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1.  数学(点乘/叉乘)/unity3d的数学辅助类 2.  坐标系统(本地/世界/屏幕) 3.  Unity3d执行流程 4.  计算角色和目标点的夹角.旋转角色朝向目标点,然后移动角色(样例) 5.  Gizmos/inspector/地图编辑 6.  脚本文件间的数据交互 7.  Yield return/协同线程/事件 8.  Socket 9.  Unity3D调用c++DL

Unity3D 代理的使用及获取两个碰撞器的碰撞点

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,我们致力于打造业内unity3d培训.学习第一品牌. Unity中的事件机制封装的并不是特别好,如果学过AS3的,会发现再也没有比AS3封装的更完美的了,包括事件机制用起来都是那么的完美.步入正题:首先创建一个类,比如MyClass,在MyClass中定义代理: public delegate void ColorChangeEventHandle

AS3多线程快速入门(三):NAPE物理引擎+Starling[译]

原文链接:http://esdot.ca/site/2012/intro-to-as3-workers-part-3-nape-physics-starling [更新]Adobe在11.4正式发布的最后一刻移除了ByteArray.shareable功能的支持,推迟到11.5版本再发布.为了解决这个问题,源码已经被我更新过了.但这里还是留下完整的示例代码,因为它能最终会正常运行的. 在<AS3多线程快速入门>系列教程的第一部分中,我们研究了AS3 Worker的基本原理,包括多种通信方式,还

【API】高德地图API JS实现获取坐标和回显点标记

1.搜索+选择+获取经纬度和详细地址 2.回显数据并点标记 3.实现 第一步:引入资源文件 <!--引入高德地图JSAPI --><script src="//webapi.amap.com/maps?v=1.3&key=在官网申请一个key"></script><!--引入UI组件库(1.0版本) --><script src="//webapi.amap.com/ui/1.0/main.js">

微信开发 网页授权获取用户基本信息

微信公众平台最近新推出微信认证,认证后可以获得高级接口权限,其中一个是OAuth2.0网页授权,很多朋友在使用这个的时候失败了或者无法理解其内容,希望我出个教程详细讲解一下,于是便有了这篇文章. 一.什么是OAuth2.0 官方网站:http://oauth.net/   http://oauth.net/2/ 权威定义:OAuth is An open protocol to allow secure authorization in a simple and standard method