Box2D刚体缩放

作者: ladeng6666 分类: Box2D 发布时间: 2013-01-10 23:29 阅读: 14,945

刚刚提缩放,无非就是设置一下width、height或scaleX、scaleY属性嘛,这么简单的东西也要写个教程?很遗憾的告诉你,Box2D刚体不像Flash里的显示对象,没有width、height或scaleX、scaleY这样的属性,那么怎么办呢?继续看教程!

好吧,即使不一样,这么简单的东西能做出什么样的效果?能做游戏?没错,不怕做不到,就怕想不到。Shrink it就是用刚体缩放制作的一个游戏(如下图),点击刚体进行缩放,让上面的多边形碰撞星星,这也是今天我们要模仿的效果。

shrinkit

 

不是显示对象,就无法使用width、height或scaleX、scaleY来调整刚体的大小了。不过我们还是有办法的!

b2Body类没有直接影响刚体尺寸的属性或方法,而是要通过b2Shape类的一些方法来实现,所以首先要用b2Body.GetFixtureList().GetShape()获取刚体的图形,然后根据图形的类型进行不同的设置。

我们知道b2Shape的子类有两种,一个是b2CircleShape类,这个图形的尺寸调整起来比较简单,直接调用b2CircleShape.setRadius()就可以重新设置新的半径。参数可以设置为b2CircleShape.getRadius()*scale来进行比例缩放,代码如下:

另一个是b2PolygonShape类,因为多边形的顶点数量和位置不同,形成的图形也不同,所以没有类似于SetRadius()的SetWidth()或SetHeight()方法。实际上,我们可以把多边形分解成多个顶点,多边形等比例缩放时,顶点到中心点的距离也是等比例缩放的(如下图所示),所以我们只需要用顶点向量的Multiply()方法乘以指定的缩放比例即可。

b2shapeSample

下面的示例中,我模拟了Shrink it游戏的第一关,点击动态刚体进行缩放,点击Restart按钮重置刚体。

Sorry, either Adobe flash is not installed or you do not have it enabled

完整的源代码和注释如下:

下载源文件

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

18条评论
  • Alei

    2013 年 1 月 11 日 下午 6:43

    收藏!

  • shen100

    2013 年 1 月 16 日 下午 5:09

    拉登,你的博客相当给力,挺你!

    1. ladeng6666

      2013 年 1 月 16 日 下午 10:14

      谢谢支持!

      1. shen100

        2013 年 1 月 17 日 下午 5:20

        拉登,受你影响,我也装了个wordpress,你的博客里面代码看着很舒服,是装的主题,还是插件?
        我也想弄个代码看着舒服点儿的。

        1. ladeng6666

          2013 年 1 月 17 日 下午 10:17

          我是用的插件Crayon Syntax Highlighter,去试试吧!
          其实我也是因为代码不能高亮,才放弃了新浪博客,独立门户的!

          1. shen100

            2013 年 1 月 22 日 下午 7:37

            拉登,我也用了Crayon Syntax Highlighter,很好用,谢谢推荐。
            建议你将Crayon的工具栏设置为始终显示,鼠标滑过去显示,移出要等一会儿
            才消失,感觉不好,当然,这只是我的感觉。

          2. ladeng6666

            2013 年 1 月 23 日 下午 7:51

            已经设置始终显示了,谢谢你的建议!

  • steven

    2013 年 1 月 23 日 下午 1:50

    拉登你好最近看你的教程发现,你的LDeasyBOX2D中的userData只是用来贴图的,如果我想给每个刚体在创建的时候赋一个名字怎么弄呢?

    1. ladeng6666

      2013 年 1 月 23 日 下午 7:50

      恩我也发现这个问题了,现在在写LDEasyBox2DUserData类,我会提供这个方法的!敬请期待!

  • voley

    2013 年 2 月 17 日 下午 2:06

    拉登大叔,看了部分你的box 2d相关教程,确实收获不少,不过一直有个问题弄不明白,如果我想重新设置某个 b2body 实例的坐标怎么实现,期待您的解答,谢谢!

    1. ladeng6666

      2013 年 2 月 17 日 下午 9:02

      可以通过body.SetPosition()方法手动调整刚体的坐标!但是用的时候要小心,Box2D引擎在模拟物理运动时,会自动更新刚体的坐标,不要发生冲突!

      1. 2013 年 9 月 6 日 上午 10:26

        不知用box2d+starling开发游戏,怎么 才能自适应屏幕呢
        starling里的元件大小变了,但是box2d的位置和大小就对不上了,怎么处理呢
        我用的CitrusEngine

        1. ladeng6666

          2013 年 9 月 6 日 下午 8:57

          关于Starling自适应的问题,可以通过设置stage.algin=StageAlign.TOP_LEFT,然后在设置1秒延迟后调用你的init函数,我是这么结局的,你可以试一下!

  • Alison

    2013 年 5 月 5 日 上午 5:07

    I used to be recommended this website by
    way of my cousin. I’m now not positive whether this publish is written by him as nobody else recognize such specific about my trouble. You are incredible! Thanks!

  • waffie

    2013 年 10 月 17 日 上午 10:11

    最近在学box2d,看了博主的文章收益良多啊。

  • ewrwer

    2015 年 1 月 31 日 上午 11:03

    请问怎么在cocos2d-js里面使用box2d的debugDraw?

    1. ladeng6666

      2015 年 1 月 31 日 下午 1:31

      我最近正在学习Cocos2D,JS版本的box2d不包含debugdraw,我会尝试编写适合cocos2d-js的debugdraw,请留下你的邮箱,我尽量在一周内回复你!感谢

  • 夜雨触花xl

    2015 年 4 月 13 日 下午 8:35

    转发收藏

发表评论

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