//头文件
#include "external/Box2D/Box2D.h"
#define PTM_RATIO 32.0 //这个值越大运动的越快 32是课程代码中的默认值
//创建b2wold
void kzwB2BodySecenc::crateB2Box(){
//获得屏幕的尺寸
Size winSize=Director::getInstance()->getWinSize();
//设置重力,y轴方向为9.8 模仿真实的世界
b2Vec2 gra(0,9.8);
//创建box2d世界
_world=new b2World(gra);
{
b2BodyDef def;
//设置类型 接受重力的影响
def.type = b2_dynamicBody;
//设置起始位置,为中点
def.position.Set(winSize.width / 2/PTM_RATIO, winSize.height / 2/PTM_RATIO);
//创建body物体
b2Body* body = _world->CreateBody(&def);
// 设置物体的受力
body->SetLinearVelocity(b2Vec2(10, 20));
//创建精灵
Sprite* sprite = Sprite::create("CloseNormal.png");
addChild(sprite);
sprite->setPosition(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO);
// 设置物体为圆形
b2CircleShape shape;
//半径大小
shape.m_radius = sprite->getContentSize().width / 2 / PTM_RATIO;
b2Fixture* fixture = body->CreateFixture(&shape, 1.0f /*√‹∂»œµ ˝*/);
fixture->SetFriction(0.5f); //
fixture->SetRestitution(0.5f); //
// 设置关联对象,方便找到sprite对象
body->SetUserData(sprite);
}
// 下边界
{
b2BodyDef def;
// def.position.Set(0, 0);
b2Body* body = _world->CreateBody(&def);
b2EdgeShape shape;
shape.Set(b2Vec2(0, 0), b2Vec2(winSize.width / PTM_RATIO, 0));
b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);
fixture->SetFriction(0.5f); //˝ 摩擦力 0~1 ,0为没有摩擦力
fixture->SetRestitution(0.5f); // 弹力 0~1 1.0 完全弹力
}
//上边界
{
b2BodyDef def;
def.position.Set(0, winSize.height/PTM_RATIO);
b2Body* body = _world->CreateBody(&def);
b2EdgeShape shape;
shape.Set(b2Vec2(0, 0), b2Vec2(winSize.width / PTM_RATIO, 0));
b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);
fixture->SetFriction(0.5f); // ƒ¶≤¡œµ ˝
fixture->SetRestitution(0.5f); // µØ–‘œµ ˝
}
// 左边界
{
b2BodyDef def;
//def.position.Set(0, winSize.height / PTM_RATIO);
b2Body* body = _world->CreateBody(&def);
b2EdgeShape shape;
shape.Set(b2Vec2(0, 0), b2Vec2(0, winSize.height/PTM_RATIO));
b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);
fixture->SetFriction(0.5f); // ƒ¶≤¡œµ ˝
fixture->SetRestitution(0.5f); // µØ–‘œµ ˝
}
// 右边界
{
b2BodyDef def;
def.position.Set(winSize.width / PTM_RATIO, 0);
b2Body* body = _world->CreateBody(&def);
b2EdgeShape shape;
shape.Set(b2Vec2(0, 0), b2Vec2(0, winSize.height / PTM_RATIO));
b2Fixture* fixture = body->CreateFixture(&shape, 1.0f);
fixture->SetFriction(0.5f); // ƒ¶≤¡œµ ˝
fixture->SetRestitution(0.5f); // µØ–‘œµ ˝
}
scheduleUpdate();
}
//定时器回调
void kzwB2BodySecenc::update(float dt) {
// 世界开始计时 运行
_world->Step(dt, 8, 1);
// 遍历body对象
b2Body* body = _world->GetBodyList();
while (body)
{
// 找到与body关联的sprite
Sprite* sprite = (Sprite*)body->GetUserData();
if (sprite)
{
sprite->setPosition(body->GetPosition().x*PTM_RATIO, body->GetPosition().y*PTM_RATIO);
sprite->setRotation(body->GetAngle()*180.0/M_PI);
}
body = body->GetNext();
}
}
void kzwB2BodySecenc::onExit(){
//推出界面释放_world对象
delete _world;
_world=nullptr;
}