zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C#组合算法 (2)
    用匿名函数来更方便的使用缓存
    之通用权限(五):项目描述表组(转)
    软件代码(程序)管理办法
    搭建开发架构的思路
    (转)七秘诀工作效率与薪水翻番
    uml学习入门 2面向对象方法分析与设计
    一个.Net开发组合:Powerdesigner+数据库+分层设计+.Net代码生成器+VS2005
    Log4Net介绍
    【自然框架】之通用权限(一):简介、数据结构 (转)
  • 原文地址:https://www.cnblogs.com/kingBook/p/4730565.html
Copyright © 2011-2022 走看看