Cocos2d 中 Box2D 使用笔记
2012-01-31 00:14
274 查看
使用Box2D基本步骤
I) 创建一个world object( class b2World),这个world object将是Cocos2d中的用来管理其他所有对象和进行物理模拟的主要对象。
II)创建Body 这一步又分为一下几个步骤
1)创建一个body definition来制定body的初始属性,比如位置和速度
2)通过调用world object的方法并使用body definition来创建body object
3)创建一个shape来代表你想模拟的对象
4)创建一个Friction definition,并把
一个重要的话题:碰撞 (collision)
为了找到什么时候一个fixture跟另外一个fixture碰撞,我们需要注册一个contact listener。我们将Contact listener传给Box2D,当两个对象开始碰撞和结束碰撞时,它就会调用contact listener的方法。
两个注意事项:1)我们不能在callback里修改游戏中的物理。所以我们纪录下碰撞物体,稍后再处理它们
2)我们 不能纪录碰撞点的引用,因为它们会被重用。所以我们纪录它们的拷贝。
例程:
I) 创建一个world object( class b2World),这个world object将是Cocos2d中的用来管理其他所有对象和进行物理模拟的主要对象。
II)创建Body 这一步又分为一下几个步骤
1)创建一个body definition来制定body的初始属性,比如位置和速度
2)通过调用world object的方法并使用body definition来创建body object
3)创建一个shape来代表你想模拟的对象
4)创建一个Friction definition,并把
// Create a world b2Vec2 gravity = b2Vec2(0.0f, 0.0f); _world = new b2World(gravity); // Do we want to let bodies sleep? _world->SetAllowSleeping(true); // Create edges around the entire screen b2BodyDef groundBodyDef; groundBodyDef.position.Set(0,0); _groundBody = _world->CreateBody(&groundBodyDef); // Define the ground box shape. b2EdgeShape groundBox; // bottom groundBox.Set(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO,0)); _groundBody->CreateFixture(&groundBox,0); // top groundBox.Set(b2Vec2(0,winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO,winSize.height/PTM_RATIO)); _groundBody->CreateFixture(&groundBox,0);
一个重要的话题:碰撞 (collision)
为了找到什么时候一个fixture跟另外一个fixture碰撞,我们需要注册一个contact listener。我们将Contact listener传给Box2D,当两个对象开始碰撞和结束碰撞时,它就会调用contact listener的方法。
两个注意事项:1)我们不能在callback里修改游戏中的物理。所以我们纪录下碰撞物体,稍后再处理它们
2)我们 不能纪录碰撞点的引用,因为它们会被重用。所以我们纪录它们的拷贝。
例程:
struct MyContact { b2Fixture *fixtureA; b2Fixture *fixtureB; bool operator==(const MyContact& other) const { return (fixtureA == other.fixtureA) && (fixtureB == other.fixtureB); } }; class MyContactListener : public b2ContactListener { public: std::vector<MyContact>_contacts; MyContactListener(); ~MyContactListener(); virtual void BeginContact(b2Contact* contact); virtual void EndContact(b2Contact* contact); virtual void PreSolve(b2Contact* contact, const b2Manifold* oldManifold); virtual void PostSolve(b2Contact* contact, const b2ContactImpulse* impulse); };
相关文章推荐
- cocos2d-x之box2d使用笔记
- cocos2d-x中使用box2d时的PTM_RATIO
- 如何使用Box2D和Cocos2D制作一款像Fruit Ninja一样的游戏
- cocos2d-x学习笔记17:记录存储2:SQLite基本使用
- Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk
- cocos2d-x学习笔记17:记录存储2:SQLite基本使用 推荐
- 【Cocos2d-X开发学习笔记】第21期:动画类(CCAnimate)的使用
- cocos2d-x 3.0开发笔记---vector的使用
- Box2d学习笔记一:在cocos2d-x中启动调试绘图
- 学习笔记之cocos2d-x2.1.1实现读取.plist文件(使用数组CCArray)
- 【Cocos2d-X开发学习笔记】第14期:动作类之基本动作的使用(下)
- Cocos2d-x学习笔记:CCSprite的使用总结
- Cocos2d-X 学习笔记 12 CCTableView使用
- 使用cocos2d和box2d来制作一个Breakout游戏:第一部分
- 【Cocos2d-X开发学习笔记】第15期:动作类之摄像机动作和基本样条动作的使用
- 【Cocos2d-X开发学习笔记】第04期:渲染框架之场景类(CCScene)的使用
- Cocos2d-x笔记(六)—使用TexturePacker对图片进行打包、加密
- 实习小白::(转) Cocos2d-x 3.0 开发(九)使用Physicals代替Box2D和chipmunk
- 使用Box2d和cocos2d-x从头开始制作一个弹弓类游戏系列教材的第二部分
- <cocos2d-x for wp7>使用cocos2d-x和BOX2D来制作一个BreakOut(打砖块)游戏(二)