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.车的层次结构 一般这样分,车身,车身的包围盒,四个轮子和四个轮子的 ...
随机推荐
- OSI参考模型各层的主要功能
OSI参考模型将整个通信功能划分为7个层次,其划分的主要原则是: 1网络中各主机有相同的层次 2 不同主机的同等层具有相同的功能 3同一主机内相邻层之间通过接口通信 4 每层可以使用下层提供的服务,并 ...
- 基于ZooKeeper的分布式Session实现
1. 认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...
- Chapter 2 Open Book——4
I walked to Biology with more confidence when, by the end of lunch, he still hadn't showed. 经过中午饭之后我 ...
- putty 直接连 快捷键方式
快捷方式 : "C:\Program Files (x86)\puTTY\putty.exe" root@linux.9hlh.com d:\soft\putty.exe -pw ...
- As3.0 类的【枚举】
As3.0 类的枚举 “枚举”是您创建的一些自定义数据类型,用于封装一小组值.ActionScript 3.0 并不支持具体的枚举工具,这与 C++ 使用 enum 关键字或 Java 使用 En ...
- Eclipse/MyEclipse中使用复制粘贴功能卡的解决办法
最近在MyEclipse中编辑代码时,使用快捷键进行复制粘贴,经常会导致编辑器短暂的停顿,光标不跟随,居然反应不过来,几近假死. 想来想去应该是编辑上的什么配置或者是IDE的什么功能导致,于是进入Pr ...
- 理解本真的REST架构风格
http://kb.cnblogs.com/page/186516/ 引子 在移动互联网.云计算迅猛发展的今天,作为一名Web开发者,如果您还没听说过“REST”这个buzzword,显然已经落 ...
- Rsync数据远程同步备份
rsync的使用方法 一.设置Rsync Server端 Rsync server需要设定四个方面: 1.规划建立备份目录区 2.设定: /etc/xinetd.d/rsync 3.设定: /etc/ ...
- Qt使用中碰到的问题
1.发现table第一列在切换后变黑,或多了行数. 一般是编译出来的.exe文件所使用的qt的dll不匹配造成的.一定要使用编译时,所使用的那个版本的qt的dll.
- Java多态(一)
父类: public class Parent { public String name; private String pass; public void say1(AA aa){ System.o ...