有时候两个body碰撞时需要精确到某条边,所以在创建body的时候需要创建multiFixture,也就是多个fixture的组合。早期Box2D版本中Polygon Shape有setAsEdge方法设置每条边的fixture,v2.2.1之后只有setAsBox方法了。

方法一:可以在每条边的位置上加上一个Edge Shape,然后再body中加入这个边的fixture并保存起来,碰撞的时候就能判断是碰到哪条边了。

方法二:直接用body的createFixture(edgeShape,density)方法,直接创建一条edge的fixture,因为一般边不需要其他属性。默认边有摩擦力和弹力。

边也是以body中点为原点,所以边的起点和终点要用宽和高的一半来算。

这样添加后的碰撞种类(以player站在platform)上为例,可分为:

1. player的polygonShape和platform的topEdgeShape碰撞。

2. player的bottomEdgeShape和platform的polygonShape碰撞。

3. player的polygonShape和platform的polygonShape碰撞。

4. player的bottomEdgeShape和platform的topEdgeShape不会发生碰撞,因为他们都是Edge类型。

edgeShape的长度比polygonShape相应边的长度短一点,这样分别在判断左右两边和上下两边是否发生碰撞时,不会相互影响到。当rightEdge碰撞时,bottomEdge不会发生碰撞;当bottomEdge碰撞时,rightEdge也不会发生碰撞。

如果edgeShape的长度和polygonShape相应边的长度一样的话,当rightEdge碰撞时,bottomEdge的右端也会顶到墙上,发生碰撞,从而产生逻辑错误。比如:设定bottomShape发生碰撞时player的状态是isJump=NO,bottomEdge没有碰撞时isJump=YES。当player跳起并碰到墙壁时,isJump应该是YES状态,但bottomEdge检查到了碰撞,将isJump设为NO,这样player的其他行为和动作会发生错误。

或者把矩形polygonShape的直角顶点“切掉”,变成八边形。

如下图所示:

1.

    //DELTA_LENGTH = 0.5   //fixture1 with polygon shapeb2PolygonShape rectShape;rectShape.SetAsBox(size.x/2/PTM_RATIO, size.y/2/PTM_RATIO);b2FixtureDef fixtureDef1;p_body->CreateFixture(&fixtureDef1);//fixture2 with edge shapeb2EdgeShape edgeShape;edgeShape.Set(b2Vec2((-size.x/2 + DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO), b2Vec2((size.x/2 - DELTA_LENGTH)/PTM_RATIO, (s-size.y/2)/PTM_RATIO));b2FixtureDef fixtureDef2;fixtureDef2.shape = &edgeShape;p_bottomFixture = p_body->CreateFixture(&fixtureDef2);

2.

b2EdgeShape edgeShape;edgeShape.Set(b2Vec2((-size.x/2 + DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO), b2Vec2((size.x/2 - DELTA_LENGTH)/PTM_RATIO, (-size.y/2)/PTM_RATIO));p_bottomFixture = p_body->CreateFixture(&edgeShape, 0);

3 polygonShape必须是凸多边形,顶点按照逆时针方向依次给出

b2PolygonShape polygonShape;b2Vec2 vec[] = {b2Vec2(-size.x/2/PTM_RATIO, -size.y/2/PTM_RATIO), b2Vec2(size.x/2/PTM_RATIO, -size.y/2/PTM_RATIO), b2Vec2(size.x/2/PTM_RATIO, -size.y/4/PTM_RATIO), b2Vec2(size.x/4/PTM_RATIO, size.y/2/PTM_RATIO), b2Vec2(-size.x/4/PTM_RATIO, size.y/2/PTM_RATIO), b2Vec2(-size.x/2/PTM_RATIO, -size.y/4/PTM_RATIO)};polygonShape.Set(vec, 6);b2FixtureDef fixtureDef1;fixtureDef1.shape = &polygonShape;fixtureDef1.density = dens;fixtureDef1.friction = f;fixtureDef1.restitution = rest;p_polygonFixture = p_body->CreateFixture(&fixtureDef1);

Box2D的Edge Shape的碰撞处理相关推荐

  1. Qt学习笔记-使用shape() 使得碰撞更加精确

    官方解析如下: 这英语就我就不翻译了,就他说的,很好理解, 我就直接来个例子好了. 运行截图如下: 代码如下: myitem.h #ifndef MYITEM_H #define MYITEM_H#i ...

  2. box2d 碰撞检测_Box2d新系列 第四章 碰撞模块

    注:此文章翻译自Box2D v2.2.0用户手册,仅供学习参考. 4.1  关于 碰撞模块包括了形状以及操作形状的方法.模块也包括了动态树(dynamic tree)和broad-phase算法来提高 ...

  3. (转载)BOX2D V2.3.0 用户手册中文版(第4章)-碰撞模块

    Chapter 4 碰撞模块 4.1 关于 碰撞模块包含了形状和操作形状的函数.该模块还包含了动态树(dynamic tree)和broad-phase,用于加快大型系统的碰撞处理速度. 碰撞模块被设 ...

  4. Box2D C++ 教程-碰撞剖析

    声明:本教程翻译自:Box 2D C++ turorials - Anatomy of a collision,仅供学习参考. 在Box2D中,经常会遇到物体之间的碰撞问题,当一个碰撞发生时,就是利用 ...

  5. Box2D C++ 碰撞

    ----我的生活,我的点点滴滴!! 在Box2D中,经常会遇到物体之间的碰撞问题,当一个碰撞发生时,就是利用定制器(fixtures)用来做碰撞检测的.碰撞可以以很多 方式进行,我们可以在碰撞过程中获 ...

  6. Box2D v2.3.0 用户指南(第四章)

     第四章 碰撞模块(Collision Module) 4.1简介 碰撞模块包含形状(shape)以及操作它们的函数.此外,碰撞模块还包括dynamictree和broad-phase来加快大型系 ...

  7. Cocos2d之Box2d基础知识

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  8. Cocos2d-X Box2D内容讲解

    一.box2d基础知识 1.关于 Box2D 是一个用于游戏的 2D 刚体仿真库.从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你 ...

  9. Box2D翻译_第二章

    本文是对Box2D v2.1.2 manual中文翻译(现在网上流行的一个中文翻译是针对以前版本的,跟最新的2.1.2版有些不对应)的第二章.持续更新中...... 2. Hello Box2D 在B ...

最新文章

  1. 京东某员工吐槽995:每天晚上的人生,被莫名其妙砍掉2个小时
  2. 人类为什么更聪明 | 人脑神经元关键结构差异被揭示
  3. Spark在Windows下的环境搭建
  4. jquery如何对多个对象绑定同一事件
  5. request.getRequestDispatcher()的两个方法forward()/include()!!!
  6. Winforn中实现ZedGraph自定义添加右键菜单项(附源码下载)
  7. 浅谈 Windows API 编程
  8. Java技术专题之JVM逻辑内存回收机制研究图解版
  9. null怎么insert oracle,Oracle:如果行不存在,如何INSERT
  10. phpstudy环境下安装部署moodle平台
  11. 系统集成项目管理工程师证书有什么用?
  12. Word参考文献交叉引用——连续多项引用
  13. 爬取斗鱼主播名字和热度
  14. 4g物联网模块dtu网络远程开关控制器485通讯 工业级TTL转4G串口服务器 全网通路由模块 通信通讯模组 二次开发
  15. 哪种耳机对耳朵听力伤害较小?不妨试试骨传导耳机
  16. 读书印记 - 《心流:最优体验心理学》
  17. 耀世升级发布!阿里第三版Java多线程核心技术手册PDF全彩版
  18. android am pm常用的一些命令
  19. java.lang.NoSuchMethodException: com.xxx.xxx.xxxinit()
  20. 哥德巴赫猜想(难度:1颗星)

热门文章

  1. aws平台中为ec2实例添加双网卡
  2. Base Filtering Engine 拒绝访问解法
  3. Centos下安装MySQL全过程(linux下安装MySQL)
  4. 一. python的collections模块
  5. angular cli中的--flat参数
  6. zabbix 3.2.3 appliance默认用户名及密码
  7. Android ListView下拉刷新时卡的问题解决小技巧
  8. Delphi 延迟函数 比sleep 要好的多
  9. 组策略不让你登陆你怎么办
  10. IE与firefox区别