标签:
Cocos2d-x之物理世界(创建悬浮的物体)
在HelloWorldScene.h中添加如下内容
//创建一个运动的物体,运动的矩形
void addRect(float x, float y, b2BodyType type);
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 //让矩形在x轴平移 50 addRect(0, 5, b2_kinematicBody); 51 52 53 //调用update方法,实现每帧都改变物理世界中的物体 54 scheduleUpdate(); 55 56 return true; 57 } 58 59 60 //实现模拟物理世界的方法(当前一帧与上一帧的时间差) 61 void HelloWorld::update(float dt){ 62 63 //使用这个step方法来一步一步的模拟我们的物理世界 64 //(时间差(当前一步与最后一步的时间差,即当前一帧与上一帧的时间差), 65 //速度迭代,模拟物理世界的过程中难免会有误差,所以就用速度迭代的次数来避免误差,官方建议8次, 66 //位置的迭代,官方建议3次) 67 world->Step(dt, 8, 3); 68 69 //为了获取矩形,所以在这里定义一个Sprite 70 Sprite *s; 71 72 //获取移动的矩形 73 //在这里获取到所有的子集的对象 74 //遍历所有的子集对象, 75 for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()) { 76 // //判断,因为只有一个动态的物体,所以可以这么判断,否则,要用别的方法 77 // if (b->GetType() == b2_dynamicBody) { 78 //让所有的类型都要刷新 79 //获取到移动的物体的y 位置 80 log("%f",b->GetPosition().y); 81 82 if (b->GetUserData()) { 83 s = (Sprite*)b->GetUserData(); 84 85 //让Sprite与body同步 86 s->setPosition(b->GetPosition().x * RATIO, b->GetPosition().y * RATIO); 87 } 88 // } 89 } 90 } 91 92 93 //创建矩形,并且让其随着重力开始运动,有加速度的向下移动 94 void HelloWorld::addRect(){ 95 96 //config box2d 97 ///******************************************************************* 98 //定义一个b2BodyDef物体 99 b2BodyDef def; 100 101 // //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落 102 // def.position = b2Vec2(0, 10); 103 //定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米 104 def.position = b2Vec2(3, 5); 105 106 //配置物体的属性 107 //b2_dynamicBody是枚举类型的,代表运动的物体, 108 //还有b2_staticBody 代表静态的物体 109 //还有b2_kinematicBody 代表悬浮的物体 110 def.type = b2_dynamicBody;//此时这是个运动的物体 111 112 //创建一个物体(物体的相关的定义) 113 b2Body *body = world->CreateBody(&def); 114 115 ///******************************************************************* 116 117 118 119 120 //指定物体的fixture 121 ///******************************************************************* 122 123 b2PolygonShape shape; 124 shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子 125 126 127 b2FixtureDef fixtureDef; 128 //指定fixtuer的属性 129 fixtureDef.density = 1;//密度 130 fixtureDef.friction = 0.3;//摩擦系数 131 fixtureDef.shape = &shape; 132 body->CreateFixture(&fixtureDef); 133 134 ///******************************************************************* 135 136 137 138 139 140 //config cocos shape 141 ///******************************************************************* 142 //定义一个图形 143 auto s = Sprite::create(); 144 // //指定他的Texture图形区域 145 // s->setTextureRect(Rect(0, 0, 80, 80)); 146 147 //指定加入fixture的图形的区域 148 s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO)); 149 150 //将其添加到层中 151 addChild(s); 152 153 //配置位置 154 //cocos2d的图形区域的位置是(800 x 600) 155 //box2d的范围单位是米,官方文档上的比较精确的范围是10米之内 156 //意味着800px的位置当成10米是比较合理的,所以中间的比例是80 157 158 // //因为每一帧都同步了,所以此处可以不要了, 159 // //因为update中的s->setPosition(b->GetPosition().x * RATIO, 160 // //b->GetPosition().y * RATIO);所以就不要了 161 // //配置s的位置 162 // s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO)); 163 164 //将图形和body相关起来 165 body->SetUserData(s);//这样就将图形和body绑定起来了 166 167 ///******************************************************************* 168 } 169 170 171 172 173 //直接复制上面的代码 174 //创建矩形,并且让其随着重力开始运动,有加速度的向下移动 175 void HelloWorld::addRect(float positionx, float positiony, b2BodyType type){ 176 177 //config box2d 178 ///******************************************************************* 179 //定义一个b2BodyDef物体 180 b2BodyDef def; 181 182 // //指定def的初始化的position,x轴是0,y轴是10,代表着从10往下落 183 // def.position = b2Vec2(0, 10); 184 //定义完比例后开始修改位置,因为最高为6米,所以y轴定义为5,x轴最大为10米 185 def.position = b2Vec2(positionx, positiony); 186 187 //设置矩形的线性初速度 188 def.linearVelocity = b2Vec2(1, 0); 189 190 //配置物体的属性 191 //b2_dynamicBody是枚举类型的,代表运动的物体, 192 //还有b2_staticBody 代表静态的物体 193 //还有b2_kinematicBody 代表悬浮的物体 194 def.type = type;//此时这是个运动的物体 195 196 //创建一个物体(物体的相关的定义) 197 b2Body *body = world->CreateBody(&def); 198 199 ///******************************************************************* 200 201 202 203 204 //指定物体的fixture 205 ///******************************************************************* 206 207 b2PolygonShape shape; 208 shape.SetAsBox(0.5, 0.5);//设置一个一米的箱子 209 210 211 b2FixtureDef fixtureDef; 212 //指定fixtuer的属性 213 fixtureDef.density = 1;//密度 214 fixtureDef.friction = 0.3;//摩擦系数 215 fixtureDef.shape = &shape; 216 body->CreateFixture(&fixtureDef); 217 218 ///******************************************************************* 219 220 221 222 223 224 //config cocos shape 225 ///******************************************************************* 226 //定义一个图形 227 auto s = Sprite::create(); 228 // //指定他的Texture图形区域 229 // s->setTextureRect(Rect(0, 0, 80, 80)); 230 231 //指定加入fixture的图形的区域 232 s->setTextureRect(Rect(0, 0, 0.5 * 2 * RATIO, 0.5 * 2 * RATIO)); 233 234 //将其添加到层中 235 addChild(s); 236 237 //配置位置 238 //cocos2d的图形区域的位置是(800 x 600) 239 //box2d的范围单位是米,官方文档上的比较精确的范围是10米之内 240 //意味着800px的位置当成10米是比较合理的,所以中间的比例是80 241 242 // //因为每一帧都同步了,所以此处可以不要了, 243 // //因为update中的s->setPosition(b->GetPosition().x * RATIO, 244 // //b->GetPosition().y * RATIO);所以就不要了 245 // //配置s的位置 246 // s->setPosition(Point(def.position.x * RATIO, def.position.y * RATIO)); 247 248 //将图形和body相关起来 249 body->SetUserData(s);//这样就将图形和body绑定起来了 250 251 ///******************************************************************* 252 253 254 255 256 } 257 258 259 //添加一个地板 260 void HelloWorld::addGround(){ 261 262 //创建一个静态的物体 263 264 b2BodyDef def; 265 //指定位置 266 // def.position = b2Vec2(0, 0); 267 //为了让创建的地板铺满底部, 268 def.position = b2Vec2(400 / RATIO, 0); 269 //指定def的类型,静态的物体 270 def.type = b2_staticBody; 271 272 b2Body *body = world->CreateBody(&def); 273 274 275 b2PolygonShape groundShape; 276 //默认情况下指的是半宽和半高,单位为米 277 groundShape.SetAsBox(400 / RATIO, 0.5); 278 279 b2FixtureDef fixuredef; 280 //指定fixture的属性 281 fixuredef.density = 1;//密度 282 fixuredef.friction = 0.3;//摩擦系数 283 //为其指定一个图形区域,让其与其他图形有一个碰撞的作用 284 fixuredef.shape = &groundShape; 285 286 body->CreateFixture(&fixuredef); 287 288 289 }
标签:
原文地址:http://www.cnblogs.com/dudu580231/p/4388830.html