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 获取碰撞点加特效的更多相关文章

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

    转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1.  数学(点乘/叉乘)/unity3d的数学辅助类 2.  坐标系统(本地/世界/屏幕 ...

  2. unity 单指双指事件(单指点击移动,双指滑动拖放)

    using System.Collections; using System.Collections.Generic; using UnityEngine; public class TouchCon ...

  3. Unity中UGUI鼠标穿透UI问题的解决方法

    不过在使用时需要先获取两个红色显示的变量,graphicRaycaster和eventSystem. 这两个变量分别对应的是Canvas中的GraphicRaycaster组件和创建UI时自动生成的“ ...

  4. Egret中使用P2物理引擎

    游戏中的对象按照物理规律移动,体现重力.引力.反作用力.加速度等物体特性,实现自由落体.摇摆运动.抛物线运动,以及物理碰撞现象的模拟.用于模拟物理碰撞.物理运动的引擎称为物理引擎. 来自瑞典斯德哥尔摩 ...

  5. unity中让物体移动到鼠标点击地面任一点的位置(单击移动和双击暂停移动)并生成图标

    using UnityEngine; using System.Collections.Generic; using UnityEngine.EventSystems; using UnityEngi ...

  6. unity中让摄像机移动到鼠标点击的位置和鼠标控制平移视角

    private Vector3 targetVector3; private float movespeed=0.5f; private bool IsOver = true; private Gam ...

  7. Unity3D中的射线与碰撞检测代码

    两种不同写法的射线检测 1.获取鼠标点击的物体 if (Input.GetMouseButtonDown(0)) { Ray ray = MainCamera.ScreenPointToRay(Inp ...

  8. AI 学习

    极简状态机: /* 脚本名称: 脚本作者: 建立时间: 脚本功能: 版本号: */ using UnityEngine; using System.Collections; namespace Voi ...

  9. unity--------------------------WheelCollider和小车实验的总结

    WheelCollider总结 写了前面两篇文章,我想总结一下WheelCollider! 让我们能够更清晰的学会物理车的开发! 1.车的层次结构 一般这样分,车身,车身的包围盒,四个轮子和四个轮子的 ...

随机推荐

  1. Gentoo安装详解(三)-- 配置系统

    配置系统 系统信息: 文件系统信息: 创建/etc/fstab nano -w /etc/fstab 网络信息: Host name, Domainname, etc nano -w /etc/con ...

  2. javascript焦点图(根据图片下方的小框自动播放)

    html和css就不详细说明了,也是简单布局,通过定位把跟随图片的小框,定位到图片下方 <!DOCTYPE html> <html> <head> <meta ...

  3. hosts文件失效,配置的域名不能成功访问

    在windows7系统 hosts文件中配置域名 出现hosts文件失效  并不能正常访问域名 可能并不适用所有的这样的情况  但是我自己修改了dns的服务器的状态  就可以正常访问 如下图所示

  4. MFC下调试日志的打印

    最近项目出现点小Bug,需要调试跟踪代码,于是乎写了份打印日志的代码. CLogFile.h文件 #if !defined(AFX_LOGFILE_H__288388CA_9A3E_4F3D_A2B8 ...

  5. 基于Flash ActionScript 实现RTMP发布与播放媒本流

    1  为什么要采用Flash ActionScript实现RTMP协议发布或播放媒体流,播放媒体流,协议可控,比如对流媒体数加密,混音等. 2 核心思路使用Flash Socket建立TCP二进制传输 ...

  6. Android中的Glide加载图片

    注意:在Android Studio的项目的build.gradle中添加: compile 'com.github.bumptech.glide:glide:3.6.1' 然后同步一下 目录: 使用 ...

  7. 《JavaScript高级程序设计》读书笔记 ---函数

    函数函数对任何语言来说都是一个核心的概念.通过函数可以封装任意多条语句,而且可以在任何地方.任何时候调用执行.ECMAScript 中的函数使用function 关键字来声明,后跟一组参数以及函数体. ...

  8. 1001. A+B Format

    Calculate a + b and output the sum in standard format -- that is, the digits must be separated into ...

  9. WHM使用手册by lin

    WebHost Manager 11使用手册(WHM使用手册) 本手册翻译自cpanel官方文档. 本翻译中文版本版权归美国主机侦探所有,未经允许,禁止复制. Overview(概述) 本用户手册主要 ...

  10. DOM操作-倒排序子元素

    代码: —————————————————————————————— <script type="text/javascript">                // ...