- 浏览: 932582 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
itzhongyuan:
java Random类详解 -
david_je:
你好,我看到你在C里面回调JAVA里面的方法是在native里 ...
Android NDK开发(1)----- Java与C互相调用实例详解 -
fykyx521:
请求锁是在 oncreate 释放实在ondestroy?? ...
Android如何保持程序一直运行 -
aduo_vip:
不错,总结得好!
Android读取assets目录下的资源 -
f839903061:
给的网址很给力哦!
Android 4.0.1 源码下载,编译和运行
这个教程的目的就是让你们熟悉在cocos2d里面如何使用box2d,所采用的例子就是制作一个简单的应用,里面有一个篮球,你可以通过旋转你的iPhone来改变重力的方向,同时篮球碰到屏幕边界可以反弹。
创建一个空的工程
打开Xcode,选择 cocos2d-0.99.1 Box2d Application template来创建一个新的工程,并且命名为Box2D.如果你直接编译并且运行的话,你将会看到一个很酷的例子,里面展示了Box2d的许多内容。然后,这个教程的目的,我们将从0开始,创建一个篮球反弹的应用,这样我们就可以更好地理解那个范例的具体原理。
因此,让我们把HelloWorld模板里面的内容都删除掉,因为我们要从0开始。把HelloWorldScene.h里面的内容替换成下面的代码:
同时修改HelloWorldScene.mm文件:(为什么后缀是.mm,因为box2d是c++写的,而objective-c++的实现文件必须是.mm后缀,否则你编译会出n个错误!)
@end
最后一步----验证一下,你的Classes分组下面的所有文件(比如HelloWorldScene)是以.mm文件结尾的,如果是.m,那么请改成.mm,否则等下使用Box2d的时候,编译器会报出一大堆莫名其妙的错误!
如果你编译并运行,你应该看到一个黑色的屏幕。好了,现在让我们开始创建Box2d场景吧。
Box2D世界相关理论
在我们开始之前,让我们先交待一下Box2D具体是如何运作的。
你需要做的第一件事情就是,当使用cocos2d来为box2d创建一个world对象的时候。这个world对象管理物理仿真中的所有对象。
一旦我们已经创建了这个world对象,接下来需要往里面加入一些body对象。body对象可以随意移动,可以是怪物或者飞镖什么的,只要是参与碰撞的游戏对象都要为之创建一个相应的body对象。当然,也可以创建一些静态的body对象,用来表示游戏中的台阶或者墙壁等不可以移动的物体。
为了创建一个body对象,你需要做很多事情--首先,创建一个body定义结构,然后是body对象,再指定一个shap,再是fixture定义,然后再创建一个fixture对象。下面会一个一个解释刚刚这些东西。
你首先创建一个body定义结构体,用以指定body的初始属性,比如位置或者速度。
一旦创建好body结构体后,你就可以调用world对象来创建一个body对象了。
然后,你为body对象定义一个shape,用以指定你想要仿真的物体的几何形状。
接着创建一个fixture定义,同时设置之前创建好的shape为fixture的一个属性,并且设置其它的属性,比如质量或者摩擦力。
最后,你可以使用body对象来创建fixture对象,通过传入一个fixture的定义结构就可以了。
请注意,你可以往单个body对象里面添加很多个fixture对象。这个功能在你创建特别复杂的对象的时候非常有用。比如自行车,你可能要创建2个轮子,车身等等,这些fixture可以用关节连接起来。
只要你把所有需要创建的body对象都创建好之后,box2d接下来就会接管工作,并且高效地进行物理仿真---只要你周期性地调用world对象的step函数就可以了。
但是,请注意,box2d仅仅是更新它内部模型对象的位置--如果你想让cocos2d里面的sprite的位置也更新,并且和物理仿真中的位置相同的话,那么你也需要周期性地更新精灵的位置。
好了,现在有一些基本的了解了,还是先看看代码吧!
Box2d World 实战
好了,下载我制作的篮球图片,并且把它添加到工程里去吧。下载完后,直接拖到Resources文件夹下,同时确保 “Copy items into destination group’s folder (if needed)” 被复选中。
接下来,在HelloWorldScene.mm文件顶部添加下面的代码:
#define PTM_RATIO 32.0
这里定义了一个“像素/米”的比率。当你在cocos2d里面指定一个body在哪个位置时,你使用的单位要是米。但是,我们之前使用的都是像素作为单位,那样的话,位置就会不正确。根据Box2d参考手册,Box2d在处理大小在0.1到10个单元的对象的时候做了一些优化。这里的0.1米大概就是一个杯子那么大,10的话,大概就是一个箱子的大小。
因此,我们并不直接传递像素,因为一个很小的对象很有60×60个像素,那已经大大超过了box2d优化时所限定的大小。因此,如果我们有一个64像素的对象,我们可以把它除以PTM_RATIO,得到2米---这个长度,box2d刚好可以很好地用来做物理仿真。
好了,现在来点有意思的东西。在HelloWorldScene.h文件顶部添加下列代码:
接下来,我们创建了world对象。当我们创建这个对象的时候,需要指定一个初始的重力向量。这里,我们设置y轴方向为-30,因此,所有的body都会往屏幕下面下落。同时,我们还指定了一个值,用以指明对象不参与碰撞时,是否可以“休眠”。一个休眠的对象将不会花费处理时间,直到它与其实对象发生碰撞的时候才会“醒”过来。
接下来,我们为整个屏幕创建了一圈不可见的边。具体的步骤如下:
首先创建一个body定义结构体,并且指定它应该放在左下角。
然后,使用world对象来创建body对象。(注意,这里一定要使用world对象来创建,不能直接new,因为world对象会做一些内存管理操作。)
接着,为屏幕的每一个边界创建一个多边形shape。这些“shape”仅仅是一些线段。注意,我们把像素转换成了“meter”。通过除以之前定义的比率来实现的。
再创建一个fixture定义,指定shape为polygon shape。
再使用body对象来为每一个shape创建一个fixture对象。
注意:一个body对象可以包含许许多多的fixture对象。
接下来,我们创建篮球的body。这个步骤和之前创建地面的body差不多,但是有下面一些差别需要注意一下:
我们指定body的类型为dynamic body。默认值是static body,那意味着那个body不能被移动也不会参与仿真。很明显,我们想让篮球参与仿真。
设置body的user data属性为篮球精灵。你可以设置任何东西,但是,你设置成精灵会很方便,特别是当两个body碰撞的时候,你可以通过这个参数把精灵对象取出来,然后做一些逻辑处理。
这里使用了一个不同的shape类型--circle shape。
在这里,我们需要为这个fixture指定一些参数,因此,我们没有使用便捷方法来创建fixture。后面我们会讲到这些参数的具体意义。
[self schedule:@selector(tick:)];
最后一件事情就是调度一个tikck方法,这个方法默认是0.1秒回调一次。注意,这并不是最好的处理方式---最好的方式应该是让tick方法有固定的频率(比如每秒60次)。然后,这个教程我们就先这样了。
因此,让我们来实现tick方法。在init方法之后加入下面的代码:
第一件事情就是调用world对象的step方法,这样它就可以进行物理仿真了。这里的两个参数分别是“速度迭代次数”和“位置迭代次数”--你应该设置他们的范围在8-10之间。(译者:这里的数字越小,精度越小,但是效率更高。数字越大,仿真越精确,但同时耗时更多。8一般是个折中,如果学过数值分析,应该知道迭代步数的具体作用)。
接下来,我们要使我们的精灵匹配物理仿真。因此,我们遍历world对象里面的所有body,然后看body的user data属性是否为空,如果不为空,就可以强制转换成精灵对象。接下来,就可以根据body的位置来更新精灵的位置了。
最后一件事---清理内存!因此,在文件的末尾加入下面的代码:
编译并运行,你应该可以看到球会往下掉,并且会从屏幕底部往上面弹起来。
创建一个空的工程
打开Xcode,选择 cocos2d-0.99.1 Box2d Application template来创建一个新的工程,并且命名为Box2D.如果你直接编译并且运行的话,你将会看到一个很酷的例子,里面展示了Box2d的许多内容。然后,这个教程的目的,我们将从0开始,创建一个篮球反弹的应用,这样我们就可以更好地理解那个范例的具体原理。
因此,让我们把HelloWorld模板里面的内容都删除掉,因为我们要从0开始。把HelloWorldScene.h里面的内容替换成下面的代码:
#import "cocos2d.h" @interface HelloWorld : CCLayer { } + (id) scene; @end
同时修改HelloWorldScene.mm文件:(为什么后缀是.mm,因为box2d是c++写的,而objective-c++的实现文件必须是.mm后缀,否则你编译会出n个错误!)
#import "HelloWorldScene.h" @implementation HelloWorld + (id)scene { CCScene *scene = [CCScene node]; HelloWorld *layer = [HelloWorld node]; [scene addChild:layer]; return scene; } - (id)init { if ((self=[super init])) { } return self; }
@end
最后一步----验证一下,你的Classes分组下面的所有文件(比如HelloWorldScene)是以.mm文件结尾的,如果是.m,那么请改成.mm,否则等下使用Box2d的时候,编译器会报出一大堆莫名其妙的错误!
如果你编译并运行,你应该看到一个黑色的屏幕。好了,现在让我们开始创建Box2d场景吧。
Box2D世界相关理论
在我们开始之前,让我们先交待一下Box2D具体是如何运作的。
你需要做的第一件事情就是,当使用cocos2d来为box2d创建一个world对象的时候。这个world对象管理物理仿真中的所有对象。
一旦我们已经创建了这个world对象,接下来需要往里面加入一些body对象。body对象可以随意移动,可以是怪物或者飞镖什么的,只要是参与碰撞的游戏对象都要为之创建一个相应的body对象。当然,也可以创建一些静态的body对象,用来表示游戏中的台阶或者墙壁等不可以移动的物体。
为了创建一个body对象,你需要做很多事情--首先,创建一个body定义结构,然后是body对象,再指定一个shap,再是fixture定义,然后再创建一个fixture对象。下面会一个一个解释刚刚这些东西。
你首先创建一个body定义结构体,用以指定body的初始属性,比如位置或者速度。
一旦创建好body结构体后,你就可以调用world对象来创建一个body对象了。
然后,你为body对象定义一个shape,用以指定你想要仿真的物体的几何形状。
接着创建一个fixture定义,同时设置之前创建好的shape为fixture的一个属性,并且设置其它的属性,比如质量或者摩擦力。
最后,你可以使用body对象来创建fixture对象,通过传入一个fixture的定义结构就可以了。
请注意,你可以往单个body对象里面添加很多个fixture对象。这个功能在你创建特别复杂的对象的时候非常有用。比如自行车,你可能要创建2个轮子,车身等等,这些fixture可以用关节连接起来。
只要你把所有需要创建的body对象都创建好之后,box2d接下来就会接管工作,并且高效地进行物理仿真---只要你周期性地调用world对象的step函数就可以了。
但是,请注意,box2d仅仅是更新它内部模型对象的位置--如果你想让cocos2d里面的sprite的位置也更新,并且和物理仿真中的位置相同的话,那么你也需要周期性地更新精灵的位置。
好了,现在有一些基本的了解了,还是先看看代码吧!
Box2d World 实战
好了,下载我制作的篮球图片,并且把它添加到工程里去吧。下载完后,直接拖到Resources文件夹下,同时确保 “Copy items into destination group’s folder (if needed)” 被复选中。
接下来,在HelloWorldScene.mm文件顶部添加下面的代码:
#define PTM_RATIO 32.0
这里定义了一个“像素/米”的比率。当你在cocos2d里面指定一个body在哪个位置时,你使用的单位要是米。但是,我们之前使用的都是像素作为单位,那样的话,位置就会不正确。根据Box2d参考手册,Box2d在处理大小在0.1到10个单元的对象的时候做了一些优化。这里的0.1米大概就是一个杯子那么大,10的话,大概就是一个箱子的大小。
因此,我们并不直接传递像素,因为一个很小的对象很有60×60个像素,那已经大大超过了box2d优化时所限定的大小。因此,如果我们有一个64像素的对象,我们可以把它除以PTM_RATIO,得到2米---这个长度,box2d刚好可以很好地用来做物理仿真。
好了,现在来点有意思的东西。在HelloWorldScene.h文件顶部添加下列代码:
#import "Box2D.h" 同时在HelloWorld类中添加以下成员变量: b2World *_world; b2Body *_body; CCSprite *_ball; 然后,在HelloWorldScene.mm的init方法中加入下面的代码: CGSize winSize = [CCDirector sharedDirector].winSize; // Create sprite and add it to the layer _ball = [CCSprite spriteWithFile:@"Ball.jpg" rect:CGRectMake(0, 0, 52, 52)]; _ball.position = ccp(100, 100); [self addChild:_ball]; // Create a world b2Vec2 gravity = b2Vec2(0.0f, -30.0f); bool doSleep = true; _world = new b2World(gravity, doSleep); // Create edges around the entire screen b2BodyDef groundBodyDef; groundBodyDef.position.Set(0,0); b2Body *groundBody = _world->CreateBody(&groundBodyDef); b2PolygonShape groundBox; b2FixtureDef boxShapeDef; boxShapeDef.shape = &groundBox; groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0)); groundBody->CreateFixture(&boxShapeDef); groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO)); groundBody->CreateFixture(&boxShapeDef); groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO)); groundBody->CreateFixture(&boxShapeDef); groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0)); groundBody->CreateFixture(&boxShapeDef); // Create ball body and shape b2BodyDef ballBodyDef; ballBodyDef.type = b2_dynamicBody; ballBodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO); ballBodyDef.userData = _ball; _body = _world->CreateBody(&ballBodyDef); b2CircleShape circle; circle.m_radius = 26.0/PTM_RATIO; b2FixtureDef ballShapeDef; ballShapeDef.shape = &circle; ballShapeDef.density = 1.0f; ballShapeDef.friction = 0.2f; ballShapeDef.restitution = 0.8f; _body->CreateFixture(&ballShapeDef); [self schedule:@selector(tick:)]; 呃,这里有很多陌生的代码。我们一点点来解释一下。下面,我会一段段地重复上面的代码,那样可以解释地更加清楚一些。 CGSize winSize = [CCDirector sharedDirector].winSize; // Create sprite and add it to the layer _ball = [CCSprite spriteWithFile:@"Ball.jpg" rect:CGRectMake(0, 0, 52, 52)]; _ball.position = ccp(100, 100); [self addChild:_ball]; 首先,我们往屏幕中间加入一个精灵。如果你看了前面的教程的话,这里应该没有什么问题。 // Create a world b2Vec2 gravity = b2Vec2(0.0f, -30.0f); bool doSleep = true; _world = new b2World(gravity, doSleep);
接下来,我们创建了world对象。当我们创建这个对象的时候,需要指定一个初始的重力向量。这里,我们设置y轴方向为-30,因此,所有的body都会往屏幕下面下落。同时,我们还指定了一个值,用以指明对象不参与碰撞时,是否可以“休眠”。一个休眠的对象将不会花费处理时间,直到它与其实对象发生碰撞的时候才会“醒”过来。
b2BodyDef groundBodyDef; groundBodyDef.position.Set(0,0); b2Body *groundBody = _world->CreateBody(&groundBodyDef); b2PolygonShape groundBox; b2FixtureDef boxShapeDef; boxShapeDef.shape = &groundBox; groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0)); groundBody->CreateFixture(&boxShapeDef); groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO)); groundBody->CreateFixture(&boxShapeDef); groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO)); groundBody->CreateFixture(&boxShapeDef); groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0)); groundBody->CreateFixture(&boxShapeDef);
接下来,我们为整个屏幕创建了一圈不可见的边。具体的步骤如下:
首先创建一个body定义结构体,并且指定它应该放在左下角。
然后,使用world对象来创建body对象。(注意,这里一定要使用world对象来创建,不能直接new,因为world对象会做一些内存管理操作。)
接着,为屏幕的每一个边界创建一个多边形shape。这些“shape”仅仅是一些线段。注意,我们把像素转换成了“meter”。通过除以之前定义的比率来实现的。
再创建一个fixture定义,指定shape为polygon shape。
再使用body对象来为每一个shape创建一个fixture对象。
注意:一个body对象可以包含许许多多的fixture对象。
// Create ball body and shape b2BodyDef ballBodyDef; ballBodyDef.type = b2_dynamicBody; ballBodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO); ballBodyDef.userData = _ball; _body = _world->CreateBody(&ballBodyDef); b2CircleShape circle; circle.m_radius = 26.0/PTM_RATIO; b2FixtureDef ballShapeDef; ballShapeDef.shape = &circle; ballShapeDef.density = 1.0f; ballShapeDef.friction = 0.2f; ballShapeDef.restitution = 0.8f; _body->CreateFixture(&ballShapeDef);
接下来,我们创建篮球的body。这个步骤和之前创建地面的body差不多,但是有下面一些差别需要注意一下:
我们指定body的类型为dynamic body。默认值是static body,那意味着那个body不能被移动也不会参与仿真。很明显,我们想让篮球参与仿真。
设置body的user data属性为篮球精灵。你可以设置任何东西,但是,你设置成精灵会很方便,特别是当两个body碰撞的时候,你可以通过这个参数把精灵对象取出来,然后做一些逻辑处理。
这里使用了一个不同的shape类型--circle shape。
在这里,我们需要为这个fixture指定一些参数,因此,我们没有使用便捷方法来创建fixture。后面我们会讲到这些参数的具体意义。
[self schedule:@selector(tick:)];
最后一件事情就是调度一个tikck方法,这个方法默认是0.1秒回调一次。注意,这并不是最好的处理方式---最好的方式应该是让tick方法有固定的频率(比如每秒60次)。然后,这个教程我们就先这样了。
因此,让我们来实现tick方法。在init方法之后加入下面的代码:
- (void)tick:(ccTime) dt { _world->Step(dt, 10, 10); for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) { if (b->GetUserData() != NULL) { CCSprite *ballData = (CCSprite *)b->GetUserData(); ballData.position = ccp(b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO); ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); } } }
第一件事情就是调用world对象的step方法,这样它就可以进行物理仿真了。这里的两个参数分别是“速度迭代次数”和“位置迭代次数”--你应该设置他们的范围在8-10之间。(译者:这里的数字越小,精度越小,但是效率更高。数字越大,仿真越精确,但同时耗时更多。8一般是个折中,如果学过数值分析,应该知道迭代步数的具体作用)。
接下来,我们要使我们的精灵匹配物理仿真。因此,我们遍历world对象里面的所有body,然后看body的user data属性是否为空,如果不为空,就可以强制转换成精灵对象。接下来,就可以根据body的位置来更新精灵的位置了。
最后一件事---清理内存!因此,在文件的末尾加入下面的代码:
- (void)dealloc { delete _world; _body = NULL; _world = NULL; [super dealloc]; }
编译并运行,你应该可以看到球会往下掉,并且会从屏幕底部往上面弹起来。
发表评论
-
cocos2d-x学习之自动内存管理和常见宏
2013-07-29 15:41 9121.自动内存管理 1)概述 C++语言默认是 ... -
cocos2dx中利用xcode 调用java中的函数
2013-07-29 11:36 25291. 先把cocos2dx根目录中的 /Users/zhaos ... -
cocos2dx(v2.x)与(v1.x)的一些常用函数区别讲解
2013-07-29 10:35 1113第一个改动: CCLayer初始化 自定义Layer,类名 ... -
xcode与eclipse整合cocos2dx
2013-07-29 10:32 1223文档xcode版本是 204 1. 在xcode中创建coc ... -
粒子效果
2012-05-14 17:12 1007#ifndef __HELLOWORLD_SCENE_H__ ... -
cocos2dx 官网的小游戏 2
2012-05-12 19:48 1929第四节:怎样发射一些子弹 在HelloWorld.cpp文 ... -
cocos2dx 官网的小游戏 1
2012-05-12 18:07 1499cocos2dx 官网的小游戏 第一节: 创建各种平台的工程 ... -
两个eclipse 结合
2012-05-12 16:45 1112对于mac 平台,我使用的是两个eclipse来编写coc ... -
解析Helloworld项目
2012-05-12 11:08 3248在cocos2dx中的helloworld目录中 andro ... -
Cocos2d-x 0120 环境搭建
2012-05-12 09:37 1644从今天开始研究cocos2dx 游戏引擎 1.准备需要的 ... -
在android 上开发弹球例子 cocos2dx+box2d
2012-02-29 17:16 2575create-android-project.sh 批处理新 ... -
cocos2d-x -物理引擎box2d(1)
2012-02-28 16:20 1671在游戏中我们经常要加入物理碰撞等和物理有关的内容,在游戏中加入 ... -
Cocos2d-x 结合Box2D开发Android游戏配置方法
2012-02-28 14:46 2635先通过 create-android-projec ... -
cocos2dx编译HelloWorld
2011-12-02 12:55 1729到cocos2d下载 cocos2d-1.0.1-x-0.9 ... -
让Cocos2d-x实现全屏等比缩放适配Android各种分辨率 续
2011-10-07 13:02 4918http://www.cnblogs.com/yangws/a ... -
Java如何将图片打包到jar中
2011-08-04 00:03 3259Eclipse中使用导出Jar包后 ...
相关推荐
### 在cocos2d中使用物理引擎Box2D:弹球应用详解 #### 一、简介 在cocos2d框架中集成Box2D物理引擎是游戏开发中常见且重要的技术之一,尤其对于那些需要真实物理效果的游戏而言更是如此。Box2D是一个开源的2D物理...
总结,这个"Cocos2d-x box2d 弹球"项目展示了如何将Cocos2d-x的图形功能与Box2D的物理引擎结合,实现一个基本的物理游戏。通过学习这个项目,开发者可以深入理解游戏开发中的图形渲染、物理模拟以及用户交互等多个...
在本文中,我们将深入探讨如何利用cocos2d-x游戏引擎和Box2D物理引擎来创建一款名为“弹球2”的Breakout风格游戏。这篇文章是基于子龙山人翻译的教程的第二部分,旨在为开发者提供详尽的实现步骤和关键知识点。 ...
3. 将Box2D的刚体与cocos2d的精灵节点关联,这样在Box2D进行物理模拟的同时,cocos2d可以同步更新图形的显示。 碰撞检测是弹球程序中的另一个关键点。Box2D提供了接触监听器(ContactListener)机制,我们可以...
总结来说,COCOS2D实现弹球效果涉及的主要知识点有:物理引擎(Box2D)、碰撞检测、动画制作、用户交互以及资源管理。理解并熟练掌握这些知识点,将有助于开发者构建出具有高质量弹球效果的游戏。在实际项目中,还...
"ios泰然cocos2d弹球实例 box2d"是一个基于Cocos2D的游戏项目,它利用Box2D物理引擎来模拟弹球游戏的物理行为。Box2D是一个强大的2D物理模拟库,适用于各种游戏和模拟应用。 首先,Cocos2D提供了一个简单易用的API...
cocos2d集成了Box2D物理引擎,为开发者提供了简单易用的接口来实现游戏中的物理效果。这一章将详细讲解如何配置和使用Box2D,创建静态和动态物体,设置碰撞组和碰撞过滤器,以及实现复杂的碰撞检测和响应。此外,还...
【标题】"弹球游戏的cocos2d-x版源码"涉及的知识点主要集中在cocos2d-x游戏引擎和Box2D物理引擎的应用上。cocos2d-x是一款跨平台的游戏开发框架,使用C++编写,支持iOS、Android、Windows等多个操作系统。Box2D则是...
在cocos2d里面如何使用物理引擎box2d:弹球.pdf 在cocos2d里面如何拖拽精灵.pdf 如何使用box2d来做碰撞检测(且仅用来做碰撞检测).pdf 如何使用CCRenderTexture来创建动态纹理.pdf 如何使用cocos2d1.0来给...
本章节将介绍如何集成物理引擎(例如Box2D)到Cocos2d项目中,实现真实的物理效果。 13. 弹球游戏开发 最后,书中通过弹球游戏的案例来综合运用前面章节中所学的知识。这一部分将涵盖游戏的整体设计、关键交互元素...
《使用Cocos2d和Box2D创建Breakout游戏》 Breakout游戏,又名打砖块,是一款经典的街机游戏,玩家通过控制一块挡板反射弹球,击碎屏幕上方的各种砖块。本教程将深入讲解如何利用Cocos2d和Box2D这两个强大的开源框架...
在cocos2d里面如何使用物理引擎box2d:弹球.pdf 在cocos2d里面如何拖拽精灵.pdf 如何使用box2d来做碰撞检测(且仅用来做碰撞检测).pdf 如何使用CCRenderTexture来创建动态纹理.pdf 如何使用cocos2d1.0来给sprite...
在本篇中,我们将深入探讨Cocos2d-x游戏引擎中的Box2D物理模拟库,这对于游戏开发,尤其是2D物理交互式游戏至关重要。Box2D是一个强大的开源库,专门用于2D物理模拟,它为开发者提供了实现物体碰撞、重力、弹性以及...
在cocos2d里面如何使用物理引擎box2d:弹球.pdf 在cocos2d里面如何拖拽精灵.pdf 如何使用box2d来做碰撞检测(且仅用来做碰撞检测).pdf 如何使用CCRenderTexture来创建动态纹理.pdf 如何使用cocos2d1.0来给sprite...
3. **物理引擎应用**:Cocos Creator的内置物理引擎,如Box2D,用于模拟现实世界中的物理交互,使得游戏中的物体运动更加真实。 4. **教程和示例代码**:展示了如何在Cocos Creator中配置和使用物理系统,以便新手...
本文将详细探讨如何在cocos2dx中使用Box2D,通过实例讲解如何实现弹球和拉弓的效果。 首先,Box2D是一个开源的2D物理引擎,由Erin Catto开发,它广泛应用于各种游戏和模拟项目。Box2D的核心功能包括刚体动力学、...
3. **碰撞检测与物理引擎**:CocosCreator内置了Box2D物理引擎,可以处理物体之间的碰撞检测和响应。在弹球游戏中,小球发射后,需要检测它与其他物体(如砖块)的碰撞,从而触发相应的游戏逻辑。 4. **事件监听与...