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 }
时间: 2025-01-16 01:27:23

Cocos2d-x之物理世界(创建悬浮的物体)的相关文章

Cocos2d-x3.0游戏实例之《别救我》第二篇——创建物理世界

这篇我要给大家介绍两个知识点: 1. 创建游戏物理世界 2. 没了(小若:我噗) 害怕了?不用担心,这太简单了~! 笨木头花心贡献,啥?花心?不呢,是用心~ 转载请注明,原文地址:http://www.benmutou.com/blog/archives/804 文章来源:笨木头与游戏开发 3.0新亮点,史上最简单的物理引擎 在Cocos2d-x3.0里使用物理引擎,会很有快感,因为很多繁琐的东西它都帮我们封装好了. 那么,我要开始创建游戏的关卡场景了,大家跟紧了. 我们给关卡场景命名为Toll

coco2d-x 3.0游戏实例学习笔记 《跑酷》 二 游戏界面--全新的3.0物理世界

从这里开始,就和之前前辈的有很多不同啦. 在MainScene中,开始按钮中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,而且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是很简单的,因为它都帮我们封装好了. 那么这一步,我们在PlayScene 中主要完成以下功能: 1.物理世界创建 2.创建一个地面的物理刚体 相关知识个人见解: 所谓的创建物理世界,个人觉得是一个抽象的东东,作为新手,开始并不能理解,开始你可以就

coco2d-x 3.0游戏实例学习笔记 《跑酷》 第二步---游戏界面&全新的3.0物理世界

说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程.用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写.并做相关笔记 从这里開始,就和之前前辈的有非常多不同啦. 在MainScene中,開始button中,我们就要通过回调函数,进入到我们的游戏场景啦. 那么在游戏场景中我们定义为:PlayScene ,并且是一个带物理世界的场景,cocos2d-x 3.0中要创建物理Scene是非常easy的,由于它都帮我们封装好

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

Cocos2d-x之物理世界(创建运动的物体)

在AppDelegate.cpp中配置glview的属性 //配置glview的属性,屏幕的最高处是600,最右边是800 glview->setDesignResolutionSize(800, 600, ResolutionPolicy::SHOW_ALL); AppDelegate.cpp中的内容如下 #include "AppDelegate.h" #include "HelloWorldScene.h" USING_NS_CC; AppDelegat

cocos2d-x快乐的做让人快乐的游戏3:cocos-2d 3.x中的物理世界

Cocos2d-x 3.0+ 中全新的封装的物理引擎给了开发人员最大的便捷,你不用再繁琐与各种物理引擎的细节,全然的封装让开发人员能够更快更好的将物理引擎的机制加入?到自己的游戏中,简化的设计是从2.0到3.0+的一个质的飞跃.(假设用的2.x版本号的cocos2d-x,看前一篇文章box2d) 以下相同以一个小demo来展示一下物理引擎的运用,同一时候说一下我在运用物理引擎中遇到的一些小小的问题. Cocos2d-x 3.0+中的物理属性: 1.物理世界被集成到场景中,当你创建一个场景,你能够

Quick-cocos2d-x3.3 Study (十三)--------- 创建物理世界的边界 ( 创建一个带物理效果的线条 )

创建物理效果的线条 1 -- 创建物理世界的边界 2 -- 创建物理世界的上边界 3 -- 通过设置两个点来创建一条带物理效果的线条 4 local top = display.newNode() 5 local topBody = cc.PhysicsBody:createEdgeSegment( 6 -- 第一个点的位置 7 cc.p( 100, display.top - 100 ), 8 -- 第二个点的位置 9 cc.p( display.right - 100, display.to

cocos2d-x之物理世界(创建物理世界)

首先在HelloWorld.h中引入包名:#include <Box2D/Box2D.h> 在HelloWorld.h类中添加如下内容: private: b2World *world;//创建一个私有的变量,即物理世界 public: //为了模拟世界的运行,重写update方法,他会没隔一帧执行一次, //我们的世界也要每隔一帧就重新计算一下世界中的物体所处的位置 virtual void update(float dt); 在bool HelloWorld::init()中 //创建一个

15--Box2D使用(一、创建物理世界)

创建工程Box2DTest,去掉背景和精灵对象等.首先在HelloWorldScene.h头文件定义一个屏幕像素与物理世界长度转换宏,并引入box2D头文件 #define PIXEL_TO_METER 30 #include "Box2D/Box2D.h" 再声明几个函数与变量 void createWorld(); //创建物理世界 void createWall(); //创建四周墙体 void createBall(); //创建刚体   b2World* world;