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
Nape 获取碰撞点加特效的更多相关文章
- unity3d 数学的数学基础和辅助类
		
转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1. 数学(点乘/叉乘)/unity3d的数学辅助类 2. 坐标系统(本地/世界/屏幕 ...
 - unity 单指双指事件(单指点击移动,双指滑动拖放)
		
using System.Collections; using System.Collections.Generic; using UnityEngine; public class TouchCon ...
 - Unity中UGUI鼠标穿透UI问题的解决方法
		
不过在使用时需要先获取两个红色显示的变量,graphicRaycaster和eventSystem. 这两个变量分别对应的是Canvas中的GraphicRaycaster组件和创建UI时自动生成的“ ...
 - Egret中使用P2物理引擎
		
游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...
 - unity中让物体移动到鼠标点击地面任一点的位置(单击移动和双击暂停移动)并生成图标
		
using UnityEngine; using System.Collections.Generic; using UnityEngine.EventSystems; using UnityEngi ...
 - unity中让摄像机移动到鼠标点击的位置和鼠标控制平移视角
		
private Vector3 targetVector3; private float movespeed=0.5f; private bool IsOver = true; private Gam ...
 - Unity3D中的射线与碰撞检测代码
		
两种不同写法的射线检测 1.获取鼠标点击的物体 if (Input.GetMouseButtonDown(0)) { Ray ray = MainCamera.ScreenPointToRay(Inp ...
 - AI 学习
		
极简状态机: /* 脚本名称: 脚本作者: 建立时间: 脚本功能: 版本号: */ using UnityEngine; using System.Collections; namespace Voi ...
 - unity--------------------------WheelCollider和小车实验的总结
		
WheelCollider总结 写了前面两篇文章,我想总结一下WheelCollider! 让我们能够更清晰的学会物理车的开发! 1.车的层次结构 一般这样分,车身,车身的包围盒,四个轮子和四个轮子的 ...
 
随机推荐
- Gentoo安装详解(五)-- 安装X桌面环境
			
安装X桌面环境: 安装Xorg: 检测显卡信息: dmesg | grep video lspci | grep -i VGA 配置INPUT_DEVICE.VIDEO_CARDS变量: 在安装Xor ...
 - WTL中菜单栏及工具栏项状态改变应注意的地方
			
WTL中菜单栏项和工具栏按钮的状态可通过UISetCheck(int ITEM_ID, int STATE)进行设置 需要注意的是要将需要改变状态的控件ID添加到UI更新映射中 /* MainFram ...
 - Openjudge-计算概论(A)-比饭量
			
描述: 3个人比饭量,每人说了两句话: A说:B比我吃的多,C和我吃的一样多 B说:A比我吃的多,A也比C吃的多 C说:我比B吃得多,B比A吃的多. 事实上,饭量和正确断言的个数是反序的关系. 请编程 ...
 - iOS动画编程
			
IOS中的动画总结来说有五种:UIView<block>,CAAnimation<CABasicAnimation,CATransition,CAKeyframeAnimation& ...
 - Spring的Resource
			
通过Spring Resource接口获取资源(取自http://haohaoxuexi.iteye.com/blog/2016305)目录1 Resource简介2 通过ResourceLoader ...
 - 网络通信框架Apache MINA
			
Apache MINA(Multipurpose Infrastructure for Network Applications) 是 Apache 组织一个较新的项目,它为开发高性能和高可用性的网络 ...
 - iOS https plist
			
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key ...
 - Python基础篇-day3
			
主要内容:字典 集合 文件处理 字符编码 1.字典dict简介dict就是key value值,索引有意义,数据无序 key定义规则:a:不可变--数字.字符串.元组(可变--列表.字典)b:不能重复 ...
 - DateUtils时间工具类探究
			
首先声明一下,这个DateUtils工具类不是自己写的,而是在commons-lang-2.Xjar包或是commons-lang3-3.X.jar包中,具体在哪个jar包中,看程序具体添加了哪个版本 ...
 - 《JavaScript高级程序设计》读书笔记 ---函数
			
函数函数对任何语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体. ...