Cocos2d-x之物理世界(创建静态的物体)

摘要:
Cocos2d-x之物理世界在HelloWorldScene.h中添加如下内容//创建一个地板voidaddGround();HelloWorldScene。

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 namespacecocostudio::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     returnscene;
25 }
26 
27 //on "init" you need to initialize your instance
28 boolHelloWorld::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(floatdt){
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 voidHelloWorld::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 voidHelloWorld::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 }

免责声明:文章转载自《Cocos2d-x之物理世界(创建静态的物体)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mybatis父查询值嵌套传递/column传入多个参数值197MySql 获取当前节点及递归所有上级节点下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

cocos2d-x学习 之一

最近准备学习cocos2d-x的开发,首先要搭建一下开发环境。今天就先搭建一下开发环境。本人系统为Mint-15 64位的linux,以下的开发环境只用于linux。首先到cocos2d-x的官网上下载安装包,由于cocos2d-x是开源的,所以我们可以查看源码,从以下地址下载: http://www.cocos2d-x.org/download 我们下载2...

Cocos2d-x 3.0 触摸机制

在Cocos2dx 3.0版本中,废弃了以往2.x版本的写法,我们先来看一下Layer.h中的一段代码: 1 2 3 4 5 6 7 8 9 10 11 //单点触摸 virtualboolonTouchBegan(Touch*touch,Event*unused_event); virtualvoidonTouchMo...

cocos2d实例移动精灵

原文链接:http://iphonedev.net/2009/05/10/cocos2d-example-move-sprite/ (注:原文写的较早,与现在的版本有点出入,这里我直接换成目前版本) Cocos2d 引擎大大的简化了iphone游戏开发的过程。在这个实例中,我们将用一个红色的小方块图片做为精灵,当我们触摸屏幕时,精灵将会平滑的移动到触摸处,...

cocos2d-x 模态对话框的实现

心情不好,恩,不扯淡了。直接讲。 ================================== 在泰然看了一篇实现模态对话框的文章,写的还不错,然后在其基础上加了我简单加了一层灰色透明背景。这样子界面效果看起来会更友好一点,好吧。原谅我的无耻,原创转载什么的也不在意了,原文在这里,今天感觉有点累,恩。主要是大神不能带我飞了,非常是失落,好吧...

Cocos2d-x教程(35)-三维拾取Ray-AABB碰撞检測算法

欢迎增加Cocos2d-x 交流群:193411763 转载时请注明原文出处 :http://blog.csdn.net/u012945598/article/details/39927911 -------------------------------------------------------------------...

Cocos2d-x Lua 阅读Csv文件,使用数据更方便

在我的书或出售之前,我的源代码,有Csvshadow文件。 也许这是偏见。我与工作将是最长的轮廓Csv,所以,我会帮助不大喜欢它的游戏。 Csv文件,非常格式easy,也就是说,一个数据线,字段之间用逗号分隔,策划也能够方便地使用Excel进行编辑。 Csv格式的文件。解析起来也非常easy,所以自己动手写写非常快~(小若:我就喜欢拿来主义,你怎么着)...