"T06Box2D.h" #define PTM_RATIO 32.0f bool T06Box2D::init(); //创建世界,后面的-9.8表示向下的重力加速度为9.8 //b2Vec2 gravity(0,-9.8f); //这个表示没有重力加速度 b2Vec2 gravity(0,0.0f); _world = new b2World(gravity); { b2BodyDef def; //这里是一个动态的body,默认是静态的body def.type = b2_dynamicBody; //设置位置,要转换成重力场中的位置要除以PTM_RATIO def.position.Set(winSize.width / 2 / PTM_RATIO,winSize.height / 2 / PTM_RATIO); b2Body* body = _world->CreateBody(&def); //让body受力 body->SetLinearVelocity(b2Vec2(10,20)); //显示body的精灵 Sprite* sprite = Sprite::"CloseNormal.png"); addChild(sprite); sprite->setPosition(body->GetPosition().x*body->GetPosition().y*PTM_RATIO); //设置body的形状,让它和sprite相一致,是圆形的 b2CircleShape shape; //设置半径 shape.m_radius = sprite->getContentSize().width / 2 / PTM_RATIO; //后面的一个参数表示的是密度系数 b2Fixture* fixture = body->CreateFixture(&shape,1.0f); //设置摩擦系统 fixture->SetFriction(0.0f); //弹性系数 fixture->SetRestitution(1.0f); //关联body和精灵 body->SetUserData(sprite); } //加个地板 { b2BodyDef def; // def.position.Set(0,0); CreateBody(&def); //设置边界类型的形状 b2EdgeShape shape; //设置地板的开始点和结束点 shape.Set(b2Vec2(0,0),b2Vec2(winSize.width / //设置摩擦系数 fixture->SetFriction(0.0f); //设置弹性系数 fixture->SetRestitution(1.0f); } //加个天花板 { b2BodyDef def; def.position.Set(0,138); font-family:新宋体; font-size:9.5pt">winSize.height / PTM_RATIO); CreateBody(&def); b2EdgeShape shape; shape. //摩擦系统 fixture->SetRestitution(1.0f); } //左挡板 { b2BodyDef def; //def.position.Set(0,winSize.height / PTM_RATIO); PTM_RATIO)); fixture->SetFriction(0.0f); //摩擦系统 fixture->SetRestitution(1.0f); //弹性系数 } //右挡板 { //摩擦系数 fixture->SetRestitution(1.0f); } //球拍 { winSize.height / 4 / CreateBody(&def); _bat = body; "bat.png"); body->SetUserData(sprite); Size batSize = Size(100,30); Size content = sprite->getContentSize(); sprite->setScale(batSize.width / content.width,batSize.height / content.height); b2PolygonShape shape; shape.SetAsBox(batSize.width / 2 / batSize.height / 2 / //摩擦系统 fixture->SetFriction(0.0f); //弹性系统 fixture->SetRestitution(1.0f); //touch EventListenerTouchOneByOne* ev = EventListenerTouchOneByOne::create(); ev->onTouchBegan = [](Touch*,133); font-family:新宋体; font-size:9.5pt">Event*){return true; }; ev->onTouchMoved = [&](Touch* touch,133); font-family:新宋体; font-size:9.5pt">Event*){ float dx = touch->getDelta().x / PTM_RATIO; b2Vec2 pos = _bat->GetPosition(); pos.x += dx; //下面的函数等价于setPosition() _bat->SetTransform(pos,0); }; _eventDispatcher->addEventListenerWithSceneGraphPriority(ev,this); } scheduleUpdate(); return true; } void update(float dt) { //时间在流逝 _world->Step(dt,8,1); //遍历这个世界的body GetBodyList(); while (body) { //设置body相关的精灵的位置 Sprite* sprite = (Sprite*)body->GetUserData(); if (sprite) { sprite->PTM_RATIO); sprite->setRotation(body->GetAngle()*180.0 / M_PI); } body = body->GetNext(); } } |