Cocos2d-x之物理世界(创建静态的物体)
在HelloWorldScene.h中添加如下内容
//创建一个地板
void addGround();
HelloWorldScene。cpp
1 #include "HelloWorldScene.h" 2 #include "cocostudio/CocoStudio.h" 3 #include "ui/CocosGUI.h" 4 5 USING_NS_CC; 6 7 using namespace cocostudio::timeline; 8 9 //定义中间的比例为80(box2d和cocos2d的转换比例) 10 #define RATIO 80.0f 11 12 Scene* HelloWorld::createScene() 13 { 14 // 'scene' is an autorelease object 15 auto scene = Scene::create(); 16 17 // 'layer' is an autorelease object 18 auto layer = HelloWorld::create(); 19 20 // add layer as a child to scene 21 scene->addChild(layer); 22 23 // return the scene 24 return scene; 25 } 26 27 // on "init" you need to initialize your instance 28 bool HelloWorld::init() 29 { 30 ////////////////////////////// 31 // 1. super init first 32 if ( !Layer::init() ) 33 { 34 return false; 35 } 36 //创建一个世界,b2world(二维矢量类型的,指定世界的加速度的方向 37 //b2Vec2(加速度的方向,向下的,所以x轴没有为0,y轴为-10))这样才能往下落 38 world = new b2World(b2Vec2(0, -10)); 39 40 41 42 //添加一个矩形,然后调用scheduleUpdate方法,实现矩形的下落,随着重力加速向下运动 43 addRect(); 44 45 //添加一个地板 46 addGround(); 47 48 49 //调用update方法,实现每帧都改变物理世界中的物体 50 scheduleUpdate(); 51 52 return true; 53 } 54 55 56 //实现模拟物理世界的方法(当前一帧与上一帧的时间差) 57 void HelloWorld::update(float dt){ 58 59 //使用这个step方法来一步一步的模拟我们的物理世界 60 //(时间差(当前一步与最后一步的时间差,即当前一帧与上一帧的时间差), 61 //速度迭代,模拟物理世界的过程中难免会有误差,所以就用速度迭代的次数来避免误差,官方建议8次, 62 //位置的迭代,官方建议3次) 63 world->Step(dt, 8, 3); 64 65 //为了获取矩形,所以在这里定义一个Sprite 66 Sprite *s; 67 68 //获取移动的矩形 69 //在这里获取到所有的子集的对象 70 //遍历所有的子集对象, 71 for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) { 72 //判断,因为只有一个动态的物体,所以可以这么判断,否则,要用别的方法 73 if (b->GetType() == b2_dynamicBody) { 74 //获取到移动的物体的y 位置 75 log("%f",b->GetPosition().y); 76 77 if (b->GetUserData()) { 78 s = (Sprite*)b->GetUserData(); 79 80 //让Sprite与body同步 81 s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y * RATIO); 82 } 83 } 84 } 85 } 86 87 88 //创建矩形,并且让其随着重力开始运动,有加速度的向下移动 89 void HelloWorld::addRect(){ 90 91 //config box2d 92 ///******************************************************************* 93 //定义一个b2BodyDef物体 94 b2BodyDef def; 95 96 // //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落 97 // def.position = b2Vec2(0, 10); 98 //定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米 99 def.position = b2Vec2(3, 5); 100 101 //配置物体的属性 102 //b2_dynamicBody是枚举类型的,代表运动的物体, 103 //还有b2_staticBody 代表静态的物体 104 //还有b2_kinematicBody 代表悬浮的物体 105 def.type = b2_dynamicBody;//此时这是个运动的物体 106 107 //创建一个物体(物体的相关的定义) 108 b2Body *body = world->CreateBody(&def); 109 110 ///******************************************************************* 111 112 113 114 115 //指定物体的fixture 116 ///******************************************************************* 117 118 b2PolygonShape shape; 119 shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子 120 121 122 b2FixtureDef fixtureDef; 123 //指定fixtuer的属性 124 fixtureDef.density = 1;//密度 125 fixtureDef.friction = 0.3;//摩擦系数 126 fixtureDef.shape = &shape; 127 body->CreateFixture(&fixtureDef); 128 129 ///******************************************************************* 130 131 132 133 134 135 //config cocos shape 136 ///******************************************************************* 137 //定义一个图形 138 auto s = Sprite::create(); 139 // //指定他的Texture图形区域 140 // s->setTextureRect(Rect(0, 0, 80, 80)); 141 142 //指定加入fixture的图形的区域 143 s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO)); 144 145 //将其添加到层中 146 addChild(s); 147 148 //配置位置 149 //cocos2d的图形区域的位置是(800 x 600) 150 //box2d的范围单位是米,官方文档上的比较精确的范围是10米之内 151 //意味着800px的位置当成10米是比较合理的,所以中间的比例是80 152 153 // //因为每一帧都同步了,所以此处可以不要了, 154 // //因为update中的s->setPosition(b->GetPosition().x * RATIO, 155 // //b->GetPosition().y * RATIO);所以就不要了 156 // //配置s的位置 157 // s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO)); 158 159 //将图形和body相关起来 160 body->SetUserData(s);//这样就将图形和body绑定起来了 161 162 ///******************************************************************* 163 164 165 166 167 } 168 169 //添加一个地板 170 void HelloWorld::addGround(){ 171 172 //创建一个静态的物体 173 174 b2BodyDef def; 175 //指定位置 176 // def.position = b2Vec2(0, 0); 177 //为了让创建的地板铺满底部, 178 def.position = b2Vec2(400 / RATIO, 0); 179 //指定def的类型,静态的物体 180 def.type = b2_staticBody; 181 182 b2Body *body = world->CreateBody(&def); 183 184 185 b2PolygonShape groundShape; 186 //默认情况下指的是半宽和半高,单位为米 187 groundShape.SetAsBox(400 / RATIO, 0.5); 188 189 b2FixtureDef fixuredef; 190 //指定fixture的属性 191 fixuredef.density = 1;//密度 192 fixuredef.friction = 0.3;//摩擦系数 193 //为其指定一个图形区域,让其与其他图形有一个碰撞的作用 194 fixuredef.shape = &groundShape; 195 196 body->CreateFixture(&fixuredef); 197 198 199 }