P2中的形状(上)

作者: ladeng6666 分类: HTML5 发布时间: 2015-06-02 21:55 阅读: 9,684

为了精确的模拟物理碰撞,我们必须为刚体设定,与贴图相同的形状,例如下图是我们喜闻乐见的几个游戏人物,它们都必须转化为物理引擎中有棱有角的形状,才能完成游戏中的出色表现。
shapInP2Part1-18

P2中设置了7中常用的形状,来满足游戏中常见的需求,这些形状包括:

  •  Capsule:胶囊形状。
  •  Circle:标准圆型。
  •  HeightFeild:地面形状。这种形状由一组y坐标组成,用来模拟高低不平的地面,如Tiny wing中的地面。
  •  Line:线段形状,用来创建高度为1个像素,长度为length的线段。
  •  Particle:粒子形状。粒子形状的尺寸均为零,没有质量和惯性….
  •  Plane:平面形状。
  •  Rectangle:矩形。

如果上面这些形状无法满足你的需求,可以通过convex类,根据实际的需要,通过已知的一组顶点,创建自定义的形状。

shapInP2Part1-13
和其他的物理引擎相比,P2有一个独特的特性,在无其他类库或插件的帮助下,可以创建凹多边形,唯一的条件是,vertices中的顶点不存在交叉或中空。

shapInP2Part1-12

形状的属性

p2中的形状种类很多,属性也不尽相同,但这些形状都继承自shape类,所以它们都拥有相同的一些属性,包括:collisionGroup、collisionMask、sensor和material。

  • collisionGroup:碰撞分组,与接下来的collisionMask一起使用,限制形状只与规定条件的形状碰撞。
  • collisionMask:碰撞筛选,与collisionGroup一起使用,限制形状至于规定条件的形状发生碰撞。
  • sensor:设置形状是否为感应区域,默认为false,如果设置为true,则该形状不参与碰撞模拟,只作为感应区域,触发碰撞事件。
  • material:形状材质,和Box2D物理引擎不同,p2中没有b2Fixture概念,刚体的材质信息,由形状中的material类,以及ContactMaterial类来定义。具体的内容,我们将在后续的教程中,陆续向你解释。

P2中的collisionGroup、collisionMask属性,和Box2D中的FilterData.categoryBits和FilterData.maskBits是一样的;而sensor属性,和Box2D中的sensor是相同的,具体请参考
http://www.ladeng6666.com/blog/2012/10/28/create-sensor-body-using-issensor/
http://www.ladeng6666.com/blog/2012/11/02/filterdata-to-separate-the-box2d-collision/

除此之外,每个形状子类,还包括了很多专属的属性,来定义形状的尺寸大小,具体请参考下表:

shapInP2Part1-08

形状的这些属性,可以在形状类的构造函数中指定,以Rectangle为例,代码如下:

或者在创建了形状对象之后,再设定属性,代码如下:

类似的,这一节,大家只是有一个大致的了解即可,针对这些特殊的形状,如Plane、HeightFeild等,我会在后面的教程中,陆续的讲解。

 举个栗子

下载本节示例并运行后,点击舞台任意位置,可以创建形状随机的刚体。如下图所示:

shapeinp2demo

示例中四周的围墙,使用了Plane形状搭建,底部高低不平的地面,通过HeightField形状实现,点击舞台任务一位置,创建矩形、圆形、胶囊或线段形状刚体。

大痔过程

  •  为每个形状创建单独的函数,如CreateCircle()、CreateRectangle、CreateLine(),来分别创建对应形状的刚体。
  •  在鼠标事件处理函数中,随机调用这些形状函数,创建对应的形状。

完整的源代码如下:

下载源代码

http://pan.baidu.com/s/1kT6Appl

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

18条评论
  • zongh14

    2015 年 6 月 3 日 下午 8:06

    又是一篇好文章,零基础刻苦学习中,希望多给予指导,急需了解碰撞

    1. ladeng6666

      2015 年 6 月 3 日 下午 8:54

      感谢支持,p2碰撞已经在我的计划中了,因为图文版耗时较长,我会调整计划,让大家尽快看到碰撞教程!

  • 木_cjgm

    2015 年 6 月 4 日 上午 11:00

    目前我看到你的bindAsset是单纯只支持矩形的.能否将常用的形状甚至于说自定义形状都添加进去呢.同时我看到constraint约束类似乎还没办法使用?我照其他地方使用没问题的p2的逻辑.然而在egret里面报错了.譬如这样Cannot use ‘in’ operator to search for ‘collideConnected’ in 4

    1. ladeng6666

      2015 年 6 月 4 日 下午 7:13

      自定义形状,我会在后后续的章节中进行介绍,关于p2中使用Constraint报错的问题,是因为官方的p2.d.ts中API不全导致的,我这两天优先更新一下p2.d.ts吧,最近好多同学在问。请持续关注我的网站!

  • SJST

    2015 年 6 月 30 日 下午 5:59

    弹性碰撞有没有参数设置?

    1. ladeng6666

      2015 年 7 月 2 日 下午 11:13

      p2中刚体的弹性,没有单独的属性,而是通过ContactMaterial对象指定。通过world的addMaterial()添加该对象后,在对象里设置碰撞对象的material属性,可以指定刚体之间的碰撞弹性,我会持续更新教程。

  • tester

    2015 年 7 月 19 日 下午 11:03

    每次教程都写的那么好,as的时代就看,egret又开始了,哈哈

  • 沉默的螺旋

    2015 年 7 月 22 日 下午 12:52

    拉登兄,关注您很久了能交换个链接吗 www.41bj.com 已加

    1. ladeng6666

      2015 年 7 月 22 日 下午 6:08

      已添加,谢谢支持!

  • tester

    2015 年 8 月 22 日 上午 12:18

    world.getBodyByID is not a function,这个太奇怪了,我看js也有,d.ts文件里也有,为什么就总提示我没有呢

    1. ladeng6666

      2015 年 8 月 22 日 下午 11:01

      提示没有,可能是编译后,项目文件夹下的libs->p2->p2.d.ts里,没有定义这个函数,如果我分析的原因不对,可以加我微信交流。

  • 九斤鱼1985

    2015 年 8 月 25 日 上午 10:17

    大神 p2的系列教程,咋不继续了呢?

  • 工人

    2015 年 9 月 5 日 上午 10:28

    不规则的用哪个

  • syw

    2015 年 9 月 6 日 下午 5:27

    博主我遇到这样error TS2339: Property ‘hitTest’ does not exist on type ‘World’,用的是你的p2

    1. ladeng6666

      2015 年 9 月 6 日 下午 8:35

      请加入我的物理游戏QQ群:334059644,我们详细的沟通,谢谢。

  • 小囧B

    2015 年 12 月 1 日 下午 12:06

    拉登大叔,我还要~

  • Pingback: P2中的形状(下) - Ladeng6666
  • wg

    2018 年 11 月 28 日 下午 4:32

    P2 中的刚体怎么改变形状的大小 期待您的回答

发表评论

电子邮件地址不会被公开。 必填项已用*标注