写在前面:
上个学期一直有学习但是都没有记录下一些学习的东西,过不了好久感觉它们又都忘掉了,感觉有点遗憾,加上之前答应别人会写点东西,于是我就来了,挑了个期末无聊的时候开始写这个博客啦。
这个博客只是用来记录一些我自己的学习学习轨迹,希望能和有共同兴趣爱好的可以一起交流学习,如果有什么不当的地方还希望大家可以指出,我会立即修改。
关于之前写了一篇博客,那篇基本算是敷衍了事,因为那个时候被迫必须参加google博客大赛,非要搞出一篇文章不可,于是就胡诌了一篇,充了下字数,没想到下面还是有很多朋友留言,但是到现在才看到,而且年代久远,猴子跳的源代码早就遗失干净了,无奈只有和那些问我要源代码的朋友说声不好意思。
还有之所以选择从WiEngine的native开发方式入手,有很多考虑,第一,我自己的学习进度在这个地方,这也是最主要的;第二,WiEngine是一款非常出色的游戏引擎;第三,native的开发方式可以采用xcode进行,这将使整个代码过程变得更加简单,高效;
我个人不喜欢在eclipse下面进行native的开发,因为,到时候整个代码提示功能没有了,还有莫名奇妙的报错,相比之下xcode有代码提示功能和优秀的debug机制,于是我更喜欢后者。至于怎么装黑苹果,怎么破解xcode网上的资料一大把了,大家百度google一下就有了。
开始正文:
对于WiEngine的学习,我一直是从微云提供的demo入手,这次也是如此。第一篇博文挑选的Box2D/Car这个demo。
下面是这次可能会学习到的关键字(我认为重要的,毕竟是学习笔记)
b2Vec2 //(box2d里面的二维向量)
b2RevoluteJointDef //(不知道怎么翻译,Joint的一种类型)
car这个demo可以大致分为一下几个部分:
// create ground b2Body* ground = NULL; { // create ground body b2BodyDef bd; ground = world->CreateBody(&bd); // create ground shape b2EdgeShape shape; b2FixtureDef fd; fd.shape = &shape; fd.density = 0.0f; fd.friction = 0.6f; shape.Set(b2Vec2(-20.0f, 0.0f), b2Vec2(20.0f, 0.0f)); ground->CreateFixture(&fd); float hs[10] = {0.25f, 1.0f, 4.0f, 3.0f, -1.0f, -1.0f, -2.0f, -2.0f, -1.25f, 0.0f}; float x = 20.0f, y1 = 0.0f, dx = 5.0f; for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.Set(b2Vec2(x, y1), b2Vec2(x + dx, y2)); ground->CreateFixture(&fd); y1 = y2; x += dx; } for (int i = 0; i < 10; ++i) { float y2 = hs[i]; shape.Set(b2Vec2(x, y1), b2Vec2(x + dx, y2)); //b2vec2 box2d 二维向量 //看了下声明,基本就是通过很多个二维向量,大家连在一起构建了一个世界嘛- -、 ground->CreateFixture(&fd); //这个方法每次创建后大家会连接在一起 y1 = y2; x += dx; } shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f)); ground->CreateFixture(&fd); //当时很奇怪 上下为什么差了40.0f 原来是中间有一个链条; x += 80.0f; shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f)); ground->CreateFixture(&fd); x += 40.0f; shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 10.0f, 5.0f)); ground->CreateFixture(&fd); //这有5的坡度哈 x += 20.0f; shape.Set(b2Vec2(x, 0.0f), b2Vec2(x + 40.0f, 0.0f)); ground->CreateFixture(&fd); x += 40.0f; shape.Set(b2Vec2(x, 0.0f), b2Vec2(x, 20.0f)); ground->CreateFixture(&fd); //这直接就是最后的那墙了 }
注释里面也写得很清楚了
二、Teeter
// Teeter 平衡木 { b2BodyDef bd; bd.position.Set(140.0f, 1.0f); bd.type = b2_dynamicBody; b2Body* body = world->CreateBody(&bd); b2PolygonShape box; box.SetAsBox(10.0f, 0.25f); body->CreateFixture(&box, 1.0f);//前面是shape,后面是密度 b2RevoluteJointDef jd; jd.Initialize(ground, body, body->GetPosition());//看过一次声明,里面有吧运算符号重写掉 //初始化一个joint 两个body 再设置一个作用点,我一开始的并不明白 为什么要有两个body才能创建,机理: //两个body的位置连线为中心线,在这个中心线的基础上再增加 限制可以转动的角度 jd.lowerAngle = -8.0f * b2_pi / 180.0f; //需要把角度 角度 转化一下 弧度 jd.upperAngle = 8.0f * b2_pi / 180.0f; jd.enableLimit = true; world->CreateJoint(&jd); body->ApplyAngularImpulse(100.0f); //一开始的时候是平衡的 加一个力 破坏它的平衡 }值得注意的地方有:
// Bridge { int N = 20; //桥的块数- -、 b2PolygonShape shape; shape.SetAsBox(1.0f, 0.125f); b2FixtureDef fd; fd.shape = &shape; fd.density = 1.0f; fd.friction = 0.6f; //摩擦力 b2RevoluteJointDef jd; b2Body* prevBody = ground; for (int i = 0; i < N; ++i) { b2BodyDef bd; bd.type = b2_dynamicBody; bd.position.Set(161.0f + 2.0f * i, -0.1f); b2Body* body = world->CreateBody(&bd); body->CreateFixture(&fd); b2Vec2 anchor(160.0f + 2.0f * i, -0.1f); jd.Initialize(prevBody, body, anchor); world->CreateJoint(&jd); prevBody = body; } //绳子的建立方式:第一个body是 ground 后面的body会变成前一个body b2Vec2 anchor(160.0f + 2.0f * N, -0.0f); jd.Initialize(prevBody, ground, anchor); world->CreateJoint(&jd); }
// Boxes { b2PolygonShape box; box.SetAsBox(0.5f, 0.5f); b2Body* body = NULL; b2BodyDef bd; bd.type = b2_dynamicBody; bd.position.Set(230.0f, 0.5f); body = world->CreateBody(&bd); body->CreateFixture(&box, 0.5f); bd.position.Set(230.0f, 1.5f); body = world->CreateBody(&bd); body->CreateFixture(&box, 0.5f); bd.position.Set(230.0f, 2.5f); body = world->CreateBody(&bd); body->CreateFixture(&box, 0.5f); bd.position.Set(230.0f, 3.5f); body = world->CreateBody(&bd); body->CreateFixture(&box, 0.5f); bd.position.Set(230.0f, 4.5f); body = world->CreateBody(&bd); body->CreateFixture(&box, 0.5f); }