VertexHelper的使用

作者:dawncold 发布时间:August 4, 2011 分类:技术

最近在用Box2d开发小游戏,不可避免用到多边形物体,当然有的形状还好描述,但大多数是那种难以描述的物体,所以这个VertexHelper就是不可或缺的武器了,它能够让你把需要的物体边界描出来,自动生成Box2d需要的边界代码。

没想到作者把软件放到app store上卖,但还提供源代码,不知道他们之间是什么不一样……

从GitHub那里得到源代码,打开xcode编译一下就能用了。

有一点需要说明,得到的源代码中Project的Base SDK是10.5,在我编译的时候提示了一个警告,现在找不到了。只需要把Target中VertexHelper的BaseSDK改为10.7就可以了,当然如果你没有10.7就只能用10.6了。可能是因为我没有10.5SDK才出现的错误吧。

Screen Shot 2011-08-04 at 下午11.01.34.png


dawncold@tianzhenmatoMacBook-Pro Project$ git clone https://github.com/jfahrenkrug/VertexHelper.git
Cloning into VertexHelper...
remote: Counting objects: 150, done.
remote: Compressing objects: 100% (88/88), done.
remote: Total 150 (delta 85), reused 96 (delta 53)
Receiving objects: 100% (150/150), 159.25 KiB | 27 KiB/s, done.
Resolving deltas: 100% (85/85), done.
dawncold@tianzhenmatoMacBook-Pro Project$ ls
A Word is A Day                   NRSMS                             gitosis-admin                     test
ConjunctionsGame                  SystemProgrammer                  hide-other-bookmark-button        齐鲁软件大赛作品源程序
EasyEditor                        Timer4NX                          progit
JavaStudy                         VertexHelper                      scifihifi-iphone
MyAchievement                     fmdb                              studygit
dawncold@tianzhenmatoMacBook-Pro Project$ cd VertexHelper/
dawncold@tianzhenmatoMacBook-Pro VertexHelper$ ls
English.lproj               PrioritySplitViewDelegate.h VertexDocument.h            VertexScanner.cpp           main.m
ImageViewGridLayer.h        PrioritySplitViewDelegate.m VertexDocument.m            VertexScanner.h
ImageViewGridLayer.m        README.md                   VertexHelper-Info.plist     VertexScannerMain.cpp
PNGLoader.cpp               SWImageView.h               VertexHelper.xcodeproj      drop_sprite.png
PNGLoader.h                 SWImageView.m               VertexHelper_Prefix.pch     icon.icns

惨痛的Box2d经验

作者:dawncold 发布时间:July 23, 2011 分类:技术

说来也可笑,Box2d中有各种各样的Shape,有多边形,矩形,圆形。我就是在用圆形的时候遇到的这样的问题:需要设置圆形的半径,我就用了这样的表达式:26 / PTM_RADIO,后面的是一个宏定义,表示拿多少像素和box2d中的米作为兑换。我这样设置后总看着圆形很不正常,半径不对,而且落到底边也不弹起来,为此还查找了API、Google等地方,看着别人的代码都没问题,就是自己的不正常。

最终还是解决了这样的问题,真羞愧,原来半径需要一个float的值,但我的表达式算出来的应该是int,不过我也曾经写过 float radius = 26 / PTM_RADIO这样的,再把radius给半径,依然无果,感觉即便是类型不对也应该自动转换过去吧,没想到这里还就是不行了。

可恶的!


26.0 / PTM_RADIO

Box2d的简单使用

作者:dawncold 发布时间:July 20, 2011 分类:技术

真不太想写,因为写这篇日志应该比写一个程序都要复杂。

我介绍的是box2d引擎在iphone上的使用方法,网上也有不少介绍的,我再简单啰嗦一番:

首先我们需要一个物理世界:b2world *world;在世界中创造各种各样的body,当然这些body都是刚体,如同经济学中的刚性需求那样,这里值得是形状不会被压扁的坚固物体。这些body默认在实例化后是静态的,除非你明显得把他们的type参数改成b2_dynamicBody,他们就能参与物理运动了。你可以给他们加入密度、弹性、摩擦等参数。这些都是每个body的属性,而这些body是需要刚刚的world创建的,而创建的函数需要一个配置单,就是一个结构体而已。

body出现之后你还不能看到,因为还需要另外的两个重要性质:fixture和shape,这里的shape有两种,一个是多边形,一个是圆形;创建shape后定义一些参数,然后把这个对象传递给fixture的对象,fixture被我叫做材质,刚才介绍的密度、弹性、摩擦等属性就是在这里定义的。当然,fixture有个shape属性,把刚刚实例化的shape对象给他即可。最后用body对象的CreateFixture函数生成fixture。这样应该就能看到你创建的物理实体了。

下面介绍一些刚刚遗漏的概念,在这个物理世界中,我们需要定义一个重要的量——重力,我们所有创建的物理实体都将按照这个重力的方向移动,而这里的重力实际上指的是一个向量,比如说是(0,-10),这样就会向着y轴-10的方向移动,而负坐标是y轴向下的,刚刚实验过,如果用(0,-100)的话,物体下移的速度会比(0,-10)的快很多,这也很明显。

另一个有意义的概念就是休眠了,其实这是创建“世界”的又一个参数,意思是如果有物体到达了无法移动的地方,比如边界,或者说出去了边界,引擎应该就不再计算它的一些数据了,这理所应当,怎么还需要解释呢?我们当然希望引擎能够把主要的计算力量给予需要的物理实体。

上面提到了一个区域的概念,是的,我们应该划定一个区域,在这个区域中的物体参与物理运算,外面的就不再参与了,但这里定义一个区域也是用了向量的方法,而且这个区域也算作一个body,有些难以理解。目前掌握得不好,就不再详述了。