【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法...
为什么80%的码农都做不了架构师?>>>
李华明Himi 原创,转载务必在明显处注明:
转载自 【黑米GameDev街区】 原文链接: http://www.himigame.com/iphone-cocos2d/474.html
上一节讲述了粒子的相关问题,当然啦,不示弱,今天继续将物理系统给大家进行简单的介绍和讲述;
首先先介绍,如何在cocos2d中加入box2d开发lib包,因为一般使用cocos2d引擎进行开发游戏时,大家创建项目都会选用cocos2d框架,而不是直接采用物理系统的cocos2d框架,但是后期忽然需要在项目中使用物理系统(这种情况很经常发生,至于为什么,童鞋们都懂得~),OK,首先创建一个普通的cocos2d项目;
OK,加入box2d->lib步骤如下:
1. 首先将box2d的lib包拷贝到刚创建的项目下,然后右键项目的libs文件夹进行导入项目中;(如果你没有box2d的lib包,那就新建一个cocos2d-box2d的项目就有了)
2.双击你的项目名默认打开配置信息窗口,点击Build Settings标签,然后在页面中找到”Search Paths“一栏,然后在“User Header Search Paths”中添加“xx/libs”;这里的XX是你的项目名称;紧接着在“User Header Search Paths”一项的上面设置“Always Serch Paths”的选项 为YES,默认为NO;这里务必要设置;
3.最后commadn+B (我用的xcode For lion)编译项目代码,如果提示编译成功,OK,可以使用啦;
下面我来给大家简单的介绍以下如何在cocos2d中使用Box2d物理系统,虽然关于Box2d的相关资料和教程很少,但是这里我也不会很详细的介绍和解释,因为我即将上市的Android游戏开发书籍中已经对Box2d进行了很详细的讲解和两个物理小游戏实战,所以这里就大概的介绍下一些重要的方法;
便于讲解,这里我直接使用Xcode直接创建一个cocos2d-Box2d的项目,然后简单的修改:
//
// HelloWorldLayer.mm
// Box2dProject
//
// Created by 华明 李 on 11-9-14.
// Himi
//
// Import the interfaces
#import "HelloWorldLayer.h"#define PTM_RATIO 32// enums that will be used as tags
enum {kTagTileMap = 1, kTagAnimation1 = 1,
};// HelloWorldLayer implementation
@implementation HelloWorldLayer+(CCScene *) scene
{ CCScene *scene = [CCScene node]; HelloWorldLayer *layer = [HelloWorldLayer node]; [scene addChild: layer]; return scene;
}// on "init" you need to initialize your instance
-(id) init
{//初始化中,在屏幕上创建了物理世界,并且创建了在屏幕四周创建了刚体防止物理世界中的刚体超屏//最后并且调用一个tick方法用于让物理世界不断的去模拟if( (self=[super init])) { self.isTouchEnabled = YES; self.isAccelerometerEnabled = YES; CGSize screenSize = [CCDirector sharedDirector].winSize;CCLOG(@"Screen width %0.2f screen height %0.2f",screenSize.width,screenSize.height); // Define the gravity vector.b2Vec2 gravity;gravity.Set(0.0f, -10.0f);bool doSleep = true; world = new b2World(gravity, doSleep); world->SetContinuousPhysics(true); // Debug Draw functionsm_debugDraw = new GLESDebugDraw( PTM_RATIO );world->SetDebugDraw(m_debugDraw); uint32 flags = 0;flags += b2DebugDraw::e_shapeBit; m_debugDraw->SetFlags(flags); b2BodyDef groundBodyDef;groundBodyDef.position.Set(0, 0); // bottom-left corner b2Body* groundBody = world->CreateBody(&groundBodyDef); b2PolygonShape groundBox; // bottomgroundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(screenSize.width/PTM_RATIO,0));groundBody->CreateFixture(&groundBox,0);// topgroundBox.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO));groundBody->CreateFixture(&groundBox,0);// leftgroundBox.SetAsEdge(b2Vec2(0,screenSize.height/PTM_RATIO), b2Vec2(0,0));groundBody->CreateFixture(&groundBox,0);// rightgroundBox.SetAsEdge(b2Vec2(screenSize.width/PTM_RATIO,screenSize.height/PTM_RATIO), b2Vec2(screenSize.width/PTM_RATIO,0));groundBody->CreateFixture(&groundBox,0);CCLabelTTF *label = [CCLabelTTF labelWithString:@"Himi" fontName:@"Marker Felt" fontSize:32];[self addChild:label z:0];label.position = ccp( screenSize.width/2, screenSize.height-50); [self schedule: @selector(tick:)];}return self;
}//Box2d调试模式,因为物理世界是看不到摸不到的,那么物理世界中的刚体其实也一样无法看到,
//但是为了便于开发调试,Box2d提供了调试类,主要作用是能将物理世界的所有刚体、关节等都利用线条框出来,
//这样便于设置你的Body与Sprite之间的位置关系 ----
-(void) draw
{glDisable(GL_TEXTURE_2D);glDisableClientState(GL_COLOR_ARRAY);glDisableClientState(GL_TEXTURE_COORD_ARRAY); world->DrawDebugData(); // restore default GL statesglEnable(GL_TEXTURE_2D);glEnableClientState(GL_COLOR_ARRAY);glEnableClientState(GL_TEXTURE_COORD_ARRAY);}
//---添加一个刚体,首先需要创建刚体的皮肤,可以理解这个皮肤是刚体的属性,然后利用皮肤包装出一个刚体
-(void) addNewSpriteWithCoords:(CGPoint)p sp:(CCSprite*)sprite
{CCLOG(@"Add sprite %0.2f x %02.f",p.x,p.y); sprite.position = ccp( p.x, p.y);b2BodyDef bodyDef;bodyDef.type = b2_dynamicBody;bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);//将精灵信息赋值给刚体皮肤,这样就能让精灵的运动轨迹与这个即将创建出的刚体在物理世界中的运动轨迹同步bodyDef.userData = sprite;b2Body *body = world->CreateBody(&bodyDef);b2PolygonShape dynamicBox;dynamicBox.SetAsBox(.9f, .9f); b2FixtureDef fixtureDef;fixtureDef.shape = &dynamicBox; fixtureDef.density = 1.0f;fixtureDef.friction = 0.3f;body->CreateFixture(&fixtureDef);//给body施加一个力b2Vec2 force = body->GetWorldVector(b2Vec2(1000.0f, 600.0f));b2Vec2 point = body->GetWorldPoint(b2Vec2(0.4f, 0.4f));body->ApplyForce(force, point);//----------备注1 Himi
}//此方法中,首先是让物理世界进行物理模拟,然后不断的遍历物理世界中的刚体运动轨迹复制给对应的精灵
-(void) tick: (ccTime) dt
{int32 velocityIterations = 8;int32 positionIterations = 1; world->Step(dt, velocityIterations, positionIterations);for (b2Body* b = world->GetBodyList(); b; b = b->GetNext()){if (b->GetUserData() != NULL) {//Synchronize the AtlasSprites position and rotation with the corresponding bodyCCSprite *myActor = (CCSprite*)b->GetUserData();myActor.position = CGPointMake( b->GetPosition().x * PTM_RATIO, b->GetPosition().y * PTM_RATIO);myActor.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());} }
}
//---触屏将添加一个body和精灵,位置为玩家触屏的坐标
- (void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{for( UITouch *touch in touches ) {CGPoint location = [touch locationInView: [touch view]]; location = [[CCDirector sharedDirector] convertToGL: location];CCSprite *sprite =[CCSprite spriteWithFile:@"icon.png"];[self addChild:sprite];[self addNewSpriteWithCoords: location sp:sprite];}
}- (void)accelerometer:(UIAccelerometer*)accelerometer didAccelerate:(UIAcceleration*)acceleration
{ static float prevX=0, prevY=0;//#define kFilterFactor 0.05f#define kFilterFactor 1.0f // don't use filter. the code is here just as an examplefloat accelX = (float) acceleration.x * kFilterFactor + (1- kFilterFactor)*prevX;float accelY = (float) acceleration.y * kFilterFactor + (1- kFilterFactor)*prevY;prevX = accelX;prevY = accelY;b2Vec2 gravity( -accelY * 10, accelX * 10);world->SetGravity( gravity );
}- (void) dealloc
{ delete world;world = NULL; delete m_debugDraw; [super dealloc];
}
@end
这里我只是对重要的方法进行的说明,主要修改的一点地方在备注1这里,我这里对每次玩家触摸屏幕的地方创建的刚体都进行施加了一个力,让刚体进行运动,那么这个运动的轨迹也会根据你设置的物理世界的重力方向发生改变,当前项目中,重力方向垂直下落,没有X轴的变化;
还要注意一点,由于box2d是c++代码,那么如果你使用box2d的话,首先把你的Delegate.m的类改成Delegate.mm,还有你使用box2d相关代码的实现类(.m)格式的类要改成(.mm)格式才可,这样编译器就会知道是混合代码,否则都当成object-c进行编译就会报错;
运行截图如下:
从图中可以看出,在icon图的周围包围着线段,这个就是Box2d提供的调试绘制,将本无形的刚体绘制出来了;
这里我不得不说一些童鞋,例如之前我写过Android上的一个自己随手的物理系统小球的例子,我在博文中写了要触屏才创建小球,但是很多童鞋问我项目运行起来没效果有问题,我就崩溃了。。。你们让我
源码本想上传,但是发现一点击上传资源就悲剧打不开网页,大家可以直接创建一个cocos2d-box2d的项目,然后将HelloWorldLayer.mm中代码换成我上面的代码即可~
原文链接: http://blog.csdn.net/xiaominghimi/article/details/6776096
转载于:https://my.oschina.net/liux/blog/49838
【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法...相关推荐
- iOS 5 cocos2d游戏开发实战(第2版)
<iOS 5 cocos2d游戏开发实战(第2版)> 基本信息 作者: [美]Steffen Itterheim Andreas Low [作译者介绍] 译者: 同济大学苹果俱乐部 丛书名 ...
- 初学者开发iOS游戏的入门必备用书——iOS 5 cocos2d游戏开发实战(第2版)
如果想接触iOS游戏开发,今天笔者就推荐一本"大杀器"--<iOS 5 cocos2d游戏开发实战(第2版)>(当当链接) 为零基础的"设想过自己写个电脑游戏 ...
- Cocos2d游戏开发之如何解包获得pvr.ccz中的美术资源
Cocos2d游戏开发之如何解包获得pvr.ccz中的美术资源 在大部分时候,Cocos2d游戏会将美术资源打包以减轻性能要求,提高加载速度.而如果我们需要获得其中的美术资源,就得解包.这里以plis ...
- [转]cocos2d游戏开发,常用工具集合
cocos2d游戏开发,常用工具集合 原文地址:http://www.cocoachina.com/bbs/read.php?tid-68951.html 位图字体工具Bitmap Font Tool ...
- 【iOS-Cocos2d游戏开发之二】Cocos2D 游戏开发资源贴(教程以及源码)
李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/iphone-cocos2d/420.html 这两天抽出 ...
- 苹果ios手机游戏开发
游戏开发是世界上创新速度最快的领域之一,这个行业里唯一的持久竞争力就是创新,而创新的根本在于学习方法,或者说运用脑的方法.在游戏开发中,用脑方法体现在用人.管理开发过程和运营等各个方面. 熟悉Obje ...
- 自学 cocos2d 游戏开发应该按什么步骤进行?
著作权归作者所有. 商业转载请联系作者获得授权,非商业转载请注明出处. 作者:孙鹏飞 链接:http://www.zhihu.com/question/21114802/answer/22840 ...
- 【Visual C++】游戏开发五十一 浅墨DirectX教程十九 网格模型进阶之路
本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8770426 作者:毛星云(浅墨 ...
- cocos-2d 游戏开发
利用cocos-2d游戏引擎进行简单的游戏开发 levelLayer.java package Layer;import android.graphics.Point; import android. ...
最新文章
- Word2Vec 使用总结
- No loop matching the specified signature and casting
- c char转int_C指针精华知识大汇总
- Micropython 如何用Turnipbit做一个自动浇水装置
- 化工原理少学时答案解析_化工原理少学时知识点
- 使用DDD、事件风暴和Actor来设计反应式系统
- Android 数据访问之External Storage 数据保存在sd卡 demo+笔记
- springboot----热部署
- 关于×××隧道技术在使用中的优势
- Yolov5学习笔记(1)——训练出自己的模型
- html ul默认的项目符号是什么形状,列表项ol、ul前项目符号
- 酒类企业1919获阿里20亿入股 已与天猫及饿了么有深度合作
- mybatis 查询忽略字段
- Xcode更新不了的解决办法
- 名帖123 徐祯卿 小楷《为朱君募买驴疏》
- tensorflow 之tf.Session
- 第3章 判断语句进阶
- html5图片平铺的代码,jQuery图片平铺效果制作网页背景图片平铺代码
- 用u盘把红旗linux操作系统安装到电脑硬盘c:,把系统装进U盘的详细步骤
- AVX指令去除-0符号位