【申精】Box2d物理引擎加入c4roid,完美配合SDL!
c4droid吧
全部回复
仅看楼主
level 12
Naurex👀 楼主

早在2个月前,我就想把Box2d编译到c4roid上了,一直没时间,拖到了现在。
今天终于有时间编译成ndk库放到c4roid上。
先来介绍下这款物理引擎:
《愤怒的小鸟》大家都知道吧,游戏里面真实的碰撞效果就是得益于这款Box2d物理引擎。要是掌握了这款引擎,编写愤怒的小鸟也不是难事。
Box2d是一款由C++编写的非常优秀的2D物理引擎,并不涉及的图形API,可移植性强,效果真实。我们只需创建一个物理世界,设置好物体,进行模拟,然后从中获取物体的坐标,角度,再进行绘制,即可得到一个真实的物理效果。
跟SDL一样,Box2d是开源的,永久免费,我们可以在官网下载源码。
2014年01月21日 02点01分 1
level 12
Naurex👀 楼主
关于Box2d的教程,我只写了在SDL上两个矩形碰撞的例子,大家可以借鉴一下。Box2d还涉及了很多东西,可以参考里面的API文档与用户手来学习,或者去网上搜集资料,在网上并没有与SDL结合使用的教程,但这并不是问题,刚刚上面讲到,Box2d并没有涉及到图形的API,所以我们只需知道Box2d的方法以及使用就可以了。
2014年01月21日 02点01分 2
level 12
Naurex👀 楼主
我编译的版本是v2.2的,Box2d每次的更新有些方法的使用都会改动,这个需要注意,里面的中文教程是2.0版本的(我只找到了旧的版本中文教程),而英文的教程是2.2版本,新的与旧的版本在某些地方会不一样,可以看API文档,API文档是2.2的,直接使用浏览器即可离线查看。
PS:建议另外在c4roid上安装SDL_gfx图片旋转与缩放拓展库,配合使用。
好了,废话不多说,下面我们开始安装。
2014年01月21日 02点01分 3
level 12
Naurex👀 楼主
2014年01月21日 02点01分 4
level 12
Naurex👀 楼主
永久下载地址
ht别tp:/吞/pan.ba我idu.c的om/share/link?shareid=3329啊294475&啊uk=290522408啊6
2014年01月21日 02点01分 5
level 12
Naurex👀 楼主
把下载后的压缩包解压。
安装说明:

如果c4roid是安装在内存卡:
把整个Box2d文件夹移动到 /sdcard/Android/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/include 里面
如果c4roid是安装在手机:
把整个Box2d文件夹移动到 /data/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/include 里面

如果c4roid安装在内存卡:
把libbox2d.a移动到 /sdcard/Android/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/lib里面
如果c4roid安装在手机内存:
把libbox2d.a移动到 /data/data/com.n0n3m4.droidc/files/gcc/arm-linux-androideabi/lib里面
③ 进入c4roid的设置,找到G++参数,进行设置。
在 (c4droid:SRC)后面加个空格,然后加上-lbox2d(也要与后面的参数有个空格)
(注意:l是小写的L,不是大写I,也不是符号!!)
设置好的参数为下面这样 :
cd (c4droid:GCCROOT)tmpdir
export TEMP=(c4droid:GCCROOT)tmpdir
(c4droid:GCCROOT)bin/(c4droid:PREFIX)-g++ (c4droid:SRC) -lbox2d -lm -ldl -llog -
lz
-I(c4droid:CURSRCDIR) -Wfatal-errors (c4droid:MODEARGS) -o (c4droid:BIN)
(c4droid:ERROUT)
2014年01月21日 02点01分 6
level 13
顶一下,先
2014年01月21日 02点01分 7
level 12
Naurex👀 楼主
2014年01月21日 02点01分 9
level 10
好多内容,好有意思,好好玩,好好学学
2014年01月21日 02点01分 12
level 12
Naurex👀 楼主
/******************************
项目:Box2d的矩形碰撞
作者:傻傻_痴痴
日期:2014.01.21
*****************************/
#include <SDL/SDL.h>
#include <Box2D/Box2D.h>
#define W 540
#define H 960
const float RATE = 50.0f;
//RATE为物理世界坐标与屏幕坐标之比
float32 timeStep = 1.0f / 60.0f; //表示物理世界模拟的时间频率
b2Vec2 gravity(0.0f, 10.0f); //重力以及方向,-10.0f则为向上
b2World world(gravity, false );
//创建一个物理世界并设置重力,第二个参数为是否允许休眠
b2Body *body1, *body2; //创建两个物体
SDL_Rect r1, r2; //SDL的两个矩形
SDL_Surface *screen; //屏幕
SDL_Rect CreateSDLRect(float32 x, float32 y, float32 w, float32 h) //创建矩形函数
{
SDL_Rect r;
//设置SDL_Rect的长宽高和坐标
r.x = x;
r.y = y;
r.w = w;
r.h = h;
return r;
}
b2Body *Createb2Body(SDL_Rect r, bool isStatic) //创建Box2d矩形函数,isStatic为是否静止
{
b2BodyDef bodyDef; //创建一个刚体
if (!isStatic)
{
bodyDef.type = b2_dynamicBody; //设置为运动物体,默认为静止
}
bodyDef.position.Set((r.x+r.w/2)/RATE,(r.y+r.h/2)/RATE); //设置刚体位置
b2Body *body = world.CreateBody(&bodyDef);
//把刚体绑定到物体
2014年01月21日 02点01分 13
level 12
Naurex👀 楼主
b2PolygonShape dynamicBox; //创建一个多边形shape,即形状
dynamicBox.SetAsBox(r.w/2/RATE, r.h/2/RATE); //设置多边形的形状
b2FixtureDef fixtureDef; //创建一个夹具
fixtureDef.shape = &dynamicBox; //设置夹具
fixtureDef.density = 1.0f; //设置密度
fixtureDef.friction = 0.3f; //设置摩擦力
fixtureDef.restitution =0.5f; //设置恢复力,即弹力
body->CreateFixture(&fixtureDef); //绑定夹具到物体上
return body; //返回body
}
void b2Logic() //获取两个物体的坐标函数
{
world.Step(timeStep, 6, 2);
b2Vec2 position1 = body1->GetPosition();
r1.x = position1.x*RATE-r1.w/2;
r1.y = position1.y*RATE-r1.h/2;
b2Vec2 position2 = body2->GetPosition();
r2.x = position2.x*RATE-r1.w/2;
r2.y = position2.y*RATE-r1.h/2;
}
int main(int argc, char *argv[])
{
SDL_Init(SDL_INIT_EVERYTHING);
screen = SDL_SetVideoMode(W, H, 32, SDL_SWSURFACE);
r1 = CreateSDLRect(200.0f, 50.0f, 200.0f, 100.0f);
r2 = CreateSDLRect(200.0f, 500.0f,200.0f, 100.0f);
body1 = Createb2Body(r1, false );
body2=Createb2Body(r2,true );
2014年01月21日 03点01分 14
level 12
Naurex👀 楼主
while (1)
{
SDL_FillRect(screen, &screen->clip_rect,SDL_MapRGB(screen->format, 0xFF, 0xFF, 0xFF)); //绘制刷屏矩形
SDL_FillRect(screen, &r1, SDL_MapRGB(screen->format, 0xBF, 0xBC, 0xFF)); //绘制第一个矩形
SDL_FillRect(screen, &r2, SDL_MapRGB(screen->format, 0xFA, 0xBC, 0xFF)); //绘制第二个矩形
SDL_Flip(screen);
b2Logic(); //不停的更新坐标
}
return 0;
}
2014年01月21日 03点01分 15
level 12
Naurex👀 楼主
上面的代码压缩包里面有,有什么不懂的直接在下面回复
2014年01月21日 03点01分 16
level 12
Naurex👀 楼主
2014年01月21日 03点01分 17
level 12
哈哈,看来以后可以更方便地学引擎了(虽说之后几个月不会有时间).......顶
2014年01月21日 03点01分 18
寒假十天
2014年01月21日 04点01分
回复 傻傻_痴痴 : 同10天[泪]
2014年01月21日 07点01分
回复 傻傻_痴痴 :9天
2014年01月21日 16点01分
level 13
这么快!就成精品贴了!!
2014年01月21日 03点01分 19
@吧主 就可以了
2014年01月21日 04点01分
level 8
羡慕怎么懂这么多[惊讶]
2014年01月21日 04点01分 20
学就可以了
2014年01月21日 05点01分
level 13
唉,越来越觉得自己太晚开始学了……
2014年01月21日 09点01分 21
我也没学多久
2014年01月21日 10点01分
@Naurex👀 没学多久是多久。。。。?
2014年01月21日 11点01分
回复 TTHHR :半年多
2014年01月21日 12点01分
@Naurex👀 你确定???啊~~~疯了疯了,半年多,我还没把书看完。。。
2014年01月22日 02点01分
level 9
[拜]大触。
2014年01月21日 11点01分 22
level 11
收藏========假如生活欺骗了你 不要忧郁不要哭泣 因为明天生活还是会欺骗你
2014年01月21日 12点01分 23
1 2 3 4 尾页