• 我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用。这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵...
    我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用。这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行自由落体运动。
      



    HelloBox2D实例
    使用Box2D引擎进行开发过程,如图12-15所示。下面我们就按照这个步骤介绍一下代码部分。首先看一下看HelloWorldScene.h文件,它的代码如下:
    #ifndef __HELLOWORLD_SCENE_H__
    #define __HELLOWORLD_SCENE_H__
    
    
    #include "cocos2d.h"
    #include "Box2D/Box2D.h"												①
    
    
    #define PTM_RATIO 32													②
    
    
    class HelloWorld : public cocos2d::Layer
    {
    	b2World* world;														③
    
    
    public:
        static cocos2d::Scene* createScene();
        virtual bool init();  
    
    
    	virtual void update(float dt);												④
    	virtual bool onTouchBegan(cocos2d::Touch* touch, cocos2d::Event* event); 			⑤
    
    
        CREATE_FUNC(HelloWorld);
    	
    	void initPhysics();														⑥
    	void addNewSpriteAtPosition(cocos2d::Vec2 p);								⑦
    
    
    };
    
    
    #endif // __HELLOWORLD_SCENE_H__


    上述第①行代码#include "Box2D/Box2D.h"是引入使用Box2D引擎需要头文件。第②行代码#define PTM_RATIO 32是定义宏PTM_RATIO,PTM_RATIO是屏幕上多少像素为1米,32表示屏幕上32像素表示1米,在Box2D中单位使用MKS公制系统,即:长度单位采用米,质量单位采用千克,时间单位采用秒。
    代码第③行world是声明物理世界b2World成员变量。第④行代码是游戏循环函数。第⑤行代码是触摸点击响应函数。第⑥行代码是声明初始化物理引擎函数initPhysics。第⑦行是声明addNewSpriteAtPosition函数,是在触摸点创建一个精灵对象。
    HelloWorldScene.cpp中HelloWorld::init()函数代码如下:
    bool HelloWorld::init()
    {
    	if ( !Layer::init() )
    	{
    		return false;
    	}
    
    
    	Size visibleSize = Director::getInstance()->getVisibleSize();
    	Vec2 origin = Director::getInstance()->getVisibleOrigin();
    
    
    	// 初始化物理引擎
    	this->initPhysics();													①
    
    
    	setTouchEnabled(true);												
    	//设置为单点触摸
    	setTouchMode(Touch::DispatchMode::ONE_BY_ONE);							
    	//开始游戏循环
    	scheduleUpdate();													②
    
    
    	return true;
    }


    上述代码第①行调用initPhysics()函数初始化物理引擎。第②行代码scheduleUpdate()是开始游戏循环,一旦开启游戏循环就会回调HelloWorld::update(float dt)函数。
    HelloWorldScene.cpp中初始化物理引擎HelloWorld::initPhysics()函数代码如下:
    void HelloWorld::initPhysics()
    {
    	Size s = Director::getInstance()->getVisibleSize();
    	
    	//重力参数
    	b2Vec2 gravity; 														①
    	gravity.Set(0.0f, -10.0f); 												②
    	//创建世界
    	world = new b2World(gravity); 											③
    	// 允许物体是否休眠
    	world->SetAllowSleeping(true);											④
    	// 开启连续物理测试
    	world->SetContinuousPhysics(true);										⑤
    	
    	//地面物体定义
    	b2BodyDef groundBodyDef;											⑥
    	//左下角
    	groundBodyDef.position.Set(0, 0);										⑦
    
    
    	//创建地面物体
    	b2Body* groundBody = world->CreateBody(&groundBodyDef);						⑧
    
    
    	//定义一个有边的形状
    	b2EdgeShape groundBox;												⑨
    
    
    	// 底部
    	groundBox.Set(b2Vec2(0,0), b2Vec2(s.width/PTM_RATIO,0));						⑩
    	//使用夹具固定形状到物体上
    	groundBody->CreateFixture(&groundBox,0);									⑪
    
    
    	// 顶部
    	groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), 
    					b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));					
    	groundBody->CreateFixture(&groundBox,0);									
    
    
    	// 左边
    	groundBox.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(0,0));							groundBody->CreateFixture(&groundBox,0);									
    
    
    	// 右边
    	groundBox.Set(b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO), 
    						b2Vec2(s.width/PTM_RATIO,0)); 								
    	groundBody->CreateFixture(&groundBox,0);									
    
    
    }


    代码第①行b2Vec2 gravity是声明重力变量,b2Vec2是一个二维矢量,它的两个属性为浮点数x和y,表示在x轴和y轴方向的矢量。第②行代码gravity.Set(0.0f, -10.0f)是设置矢量值,其中(0.0f, -10.0f)表示只有重力作用物体,-10.0f表示沿着y轴向下。
    第③行代码world = new b2World(gravity)是创建物理世界b2World对象,这里采用了new创建物理世界对象,在C++中new关键字分配内存,释放内存是delete关键字。World是成员变量,需要自己释放成员变量一般是在析构函数中释放,代码如下:
    HelloWorld::~HelloWorld()
    {
        CC_SAFE_DELETE(world); 
    }
    其中CC_SAFE_DELETE(world)是安全释放world变量,CC_SAFE_DELETE宏代表安全释放内存。
    第④行代码world->SetAllowSleeping(true)是允许物体睡眠与否,如果允许休眠,可以提高物理世界中物体的处理效率,只有在发生碰撞时才唤醒该对象。
    第⑤行代码world->SetContinuousPhysics(true)是开启连续物理测试[ 开启连续物理测试,这是因为计算机只能把一段连续的时间分成许多离散的时间点,再对每个时间点之间的行为进行演算,如果时间点的分割不够细致,速度较快的两个物体碰撞时就可能会产生“穿透”现象,开启连续物理将启用特殊的算法来避免该现象。]。
    第⑥行代码是声明形状定义(b2BodyDef)变量。第⑦行代码groundBodyDef.position.Set(0, 0)是设置形状的位置。第⑧行代码b2Body* groundBody = world->CreateBody(&groundBodyDef)是通过形状定义变量groundBodyDef创建地面物体。
    第⑨行代码是声明一个有边形状定义b2EdgeShape变量,第⑩行代码groundBox.Set(b2Vec2(0,0), b2Vec2(s.width/PTM_RATIO,0))是设置有边形状的开始位置(0,0)和结束位置(s.width/PTM_RATIO,0),s.width/PTM_RATIO是将像素换算成米。第⑪行代码是使用夹具固定形状到物体上。用类似的函数定义顶部、左边和右边的物体。
    HelloWorldScene.cpp中创建精灵HelloWorld::addNewSpriteAtPosition函数代码如下:
    void HelloWorld::addNewSpriteAtPosition(Vec2 p)
    {    
    	log("Add sprite %0.2f x %02.f",p.x,p.y);
    
    
    	//创建物理引擎精灵对象
    	auto sprite = Sprite::create("BoxA2.png");									①
    	sprite->setPosition( Vec2( p.x, p.y) );
    	this->addChild(sprite);
    
    
    	//物体定义
    	b2BodyDef bodyDef;													②
    	bodyDef.type = b2_dynamicBody;											③
    	bodyDef.position.Set(p.x/PTM_RATIO, p.y/PTM_RATIO);							④
    	b2Body *body = world->CreateBody(&bodyDef);								⑤
    	body->SetUserData(sprite);												⑥
    
    
    	// 定义2米见方的盒子形状
    	b2PolygonShape dynamicBox;											⑦
    	dynamicBox.SetAsBox(1, 1);											⑧
    
    
    	// 夹具定义
    	b2FixtureDef fixtureDef;												⑨
    	//设置夹具的形状
    	fixtureDef.shape = &dynamicBox;											⑩
    	//设置密度
    	fixtureDef.density = 1.0f;												⑪
    	//设置摩擦系数
    	fixtureDef.friction = 0.3f;												⑫
    	//使用夹具固定形状到物体上	
    	body->CreateFixture(&fixtureDef);										⑬
    
    
    }


    上述代码第①行是创建精灵(Sprite)对象,精灵(Sprite)对象与物理引擎物体是没有关系,我们需要在游戏循环函数中更新。
    代码第②行是声明动态物体定义变量,代码第③行bodyDef.type = b2_dynamicBody是设置物体类型为动态物体,物体分为静态和动态物体。第④行代码是设置物体的位置,它的单位是米。第⑤行代码b2Body *body = world->CreateBody(&bodyDef)是创建物体对象。第⑥行代码body->SetUserData(sprite)是将精灵放置到物体的UserData属性中,这样便于我们从物体中获取相关联的物体。
    第⑦行代码b2PolygonShape dynamicBox是声明多边形形状定义变量。第⑧行代码dynamicBox.SetAsBox(1, 1)是设置多边形为矩形盒子形状,由于坐标原点在盒子的左下角,SetAsBox是设置盒子的中心为(1,1),那么这个盒子的就是2米见方的大小。
    第⑨行代码是b2FixtureDef fixtureDef是声明夹具定义变量。第⑩行代码是设置夹具的形状。第⑪行代码fixtureDef.density = 1.0f是设置形状的密度。第⑫行代码fixtureDef.friction = 0.3f是设置摩擦系数,范围是0.0~1.0之间。第⑬行代码body->CreateFixture(&fixtureDef) 是使用夹具固定形状到物体上,这样物体就有了形状。
    HelloWorldScene.cpp中游戏循环函数HelloWorld::update代码如下:
    void HelloWorld::update(float dt)
    {
    	float timeStep = 0.03f; 
    	int32 velocityIterations = 8;	
    	int32 positionIterations = 1;	
    
    
    	world->Step(timeStep, velocityIterations, positionIterations);
    
    
    	for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())						①
    	{
    		if (b->GetUserData() != nullptr) {									
    			Sprite* sprite = (Sprite*)b->GetUserData();	
    			sprite->setPosition( Vec2( b->GetPosition().x * 
    				PTM_RATIO, b->GetPosition().y * PTM_RATIO) );	
    			sprite->setRotation( -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()) );
    		}
    	}																			②
    }


    其中代码①~②这段代码可以同步物理引擎中的物体与精灵位置和状态。



    更多内容请关注最新Cocos图书《Cocos2d-x实战 C++卷》
    本书交流讨论网站:http://www.cocoagame.net
    更多精彩视频课程请关注智捷课堂Cocos课程:http://v.51work6.com
    欢迎加入Cocos2d-x技术讨论群:257760386


    《Cocos2d-x实战 C++卷》现已上线,各大商店均已开售:

    京东:http://item.jd.com/11584534.html

    亚马逊:http://www.amazon.cn/Cocos2d-x%E5%AE%9E%E6%88%98-C-%E5%8D%B7-%E5%85%B3%E4%B8%9C%E5%8D%87/dp/B00PTYWTLU

    当当:http://product.dangdang.com/23606265.html

    互动出版网:http://product.china-pub.com/3770734

    《Cocos2d-x实战 C++卷》源码及样章下载地址:

    源码下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1 

    样章下载地址:http://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

    欢迎关注智捷iOS课堂微信公共平台
    展开全文
  • 1.前段时间学习一个使用box2dcocos2d-x游戏开发,反正写程序是没遇到问题,结果一编译,就傻眼了,各种无法解析的外部符,都直接指向box2d中的类,由于已经解决了,百度了张差不多的错误提示图片如下。2.大概很多...

    1.前段时间学习一个使用box2d的cocos2d-x游戏开发,反正写程序是没遇到问题,结果一编译,就傻眼了,各种无法解析的外部符,都直接指向box2d中的类,由于已经解决了,百度了张差不多的错误提示图片如下。

    这里写图片描述

    2.大概很多人都遇到了类似的让人崩溃的问题吧。其实原来问题也很简单。由于cocos2d-x 3.0版本除了支持box2d外,默认提供的物理引擎为Chipmunk,所以没有配置引入box2d工程前自然会造成链接阶段的错误。只要引入相关的文件就可以了。笔者的环境为VS2012,其实都差不多,具体步骤如下

    3.右键工程所在的解决方案(一个解决方案中可以包含多个项目,cocos2d-x把不同模块分为不同的项目,这样做的目的也是为了避免重复编译库文件,有经验的人都知道第一次新建的cocos2d-x项目编译起来时间很长,而后来再次编译时就很短了,这就是因为库文件所在的项目没有源码变化,无需重复编译,因此节省了时间,扯远了。。)点击添加。现有项目。找到–\cocos2d\external\Box2D\proj.win32 ,添加后右键生成。具体如图。

    这里写图片描述

    4.这个时候就已经在Debug下生成了LibBox2d.lib,接下来需要在把这个库链接到自己的项目上。右键项目的属性,找到链接器下的输入-附加依赖项,编辑添加LibBox2d.lib确定后即可。如图

    这里写图片描述

    5.现在开始运行项目,就不会再出错了。至此,cocos2d-x中使用box2d出现无法解析的外部符。。的问题就解决了!

    展开全文
  • 关于box2D碰撞过程中三个函数在源代码 setCategoryBitmask(int bitmask) setContactTestBitmask(int bitmask) setCollisionBitmask(int bitmask)源码: // bitmask check if ((shapeA->getCategoryBitmask() & ...

    关于box2D碰撞过程中三个函数在源代码
    setCategoryBitmask(int bitmask)
    setContactTestBitmask(int bitmask)
    setCollisionBitmask(int bitmask)

    源码: 
    // bitmask check
        if ((shapeA->getCategoryBitmask() & shapeB->getContactTestBitmask()) == 0
            || (shapeA->getContactTestBitmask() & shapeB->getCategoryBitmask()) == 0)
        {
            contact.setNotificationEnable(false);
        }
    
        if (shapeA->getGroup() != 0 && shapeA->getGroup() == shapeB->getGroup())
        {
            ret = shapeA->getGroup() > 0;
        }
        else
        {
            if ((shapeA->getCategoryBitmask() & shapeB->getCollisionBitmask()) == 0
                || (shapeB->getCategoryBitmask() & shapeA->getCollisionBitmask()) == 0)
            {
                ret = false;
            }
        }
    展开全文
  • 最近一直在做一个项目从2.2.6移植到3.11,但是cocos2d-x 2.x和3.x差别比较大,因此网上参考了许多前辈的帖子和博客总结了一下,留着以后备用。 区别1.去CC 之前2.0的CC**,把CC都去掉,基本的元素都是保留的 ...

    最近一直在做一个项目从2.2.6移植到3.11,但是cocos2d-x 2.x和3.x差别比较大,因此网上参考了许多前辈的帖子和博客总结了一下,留着以后备用。


    区别1.去CC
    之前2.0的CC**,把CC都去掉,基本的元素都是保留的
    2.0
    CCSprite  CCCallFunc CCNode ..
    3.0
    Sprite CallFunc Node ..
    
       区别2.cc***结构体改变
    2.0        
    ccp(x,y)        
    ccpAdd(p1,p2)
    ccpSub
    ccpMult
    ccpLength(p)
    ccpDot(p1,p2);
    ccc3()
    ccc4()
    ccWHITE
    CCPointZero
    CCSizeZero
    3.0
    Point(x,y)
    p1+p2;
    p1-p2
    p1*p2
    p.getLength()
    p1.dot(p2)
    Color3B()
    Color4B()
    Color3B::WHITE
    Point::ZERO
    Size:ZERO
    
       区别3.shared***改变(单例机制使用语法)
    2.0
    CCSize winSize = CCDirector::sharedDirector()->getWinSize();
    SpriteFrameCache::sharedSpriteFrameCache()
    AnimationCache::sharedAnimationCache()
    NotificationCenter::sharedNotificationCenter()
    …
    3.0
    Size size = Director::getInstance()->getWinSize();
    SpriteFrameCache::getInstance()
    AnimationCache::getInstance()
    NotificationCenter::getInstance()
    
       区别4.POD类别
    2.0
    CCPoint 
    CCSize
    CCRect
    
    3.0
    Vec2
    Size
    Rect
    
       区别5.点触事件
    auto dispatcher = Director::getInstance()->getEventDispatcher();
    auto touchListener = EventListenerTouchOneByOne::create();
    touchListener->onTouchBegan = CC_CALLBACK_2(FBMainScene::onTouchBegan,this);
    touchListener->onTouchMoved = CC_CALLBACK_2(FBMainScene::onTouchMoved,this);
    touchListener->onTouchEnded = CC_CALLBACK_2(FBMainScene::onTouchEnded, this);
    dispatcher->addEventListenerWithSceneGraphPriority(touchListener, this);
    bool FBMainScene::onTouchBegan(Touch *touch,Event *pEvent){
      CCLOG("onTouchBegan");
      Point point = this->convertToWorldSpace(this->convertTouchToNodeSpace(touch));
      return true;
    }
    void FBMainScene::onTouchMoved(Touch *touch,Event *pEvent){
      CCLOG("onTouchMoved");
    }
    void FBMainScene::onTouchEnded(Touch *touch,Event *pEvent){
      CCLOG("onTouchEnded");
    }
    //获得触点的方法也发生了改变:
    Point point = this->convertToWorldSpace(this->convertTouchToNodeSpace(touch));
    //dispatcher控制方法:
    dispatcher->addEventListener…
    dispatcher->removeEventListener(listener);
    dispatcher->removeAllListeners();
    
       区别6.CallFunc使用(使用"Function"对象)
    CallFunc::create([&](){
            Sprite *sprite = Sprite::create("s");
            this->addChild(sprite);
    });
    
       区别7.使用clone代替copy
    2.0
    CCMoveBy *action = (CCMoveBy*) move->copy();
    action->autorelease();
    3.0
    action = move->clone();
    不需要autorelease,在clone已经实现。
    
       区别8.Physics Integration 物理引擎
    暂无使用,box2d 在 3.0中可以延续使用
    在3.0的Physics中需要定义 PhysicsWorld, PhysicsBody, PhysicsShape, PhysicsJoint 等,于box2d相仿,使用前需要定义CC_USE_PHYSICS
    
       区别9.容器
    2.0
    CCArray
    
    3.0
    cocos2d::Vector<T>
    cocos2d::Map<K,V>
    cocos2d::Value


    cocos2dx2.x&3.x部分函数对照表


    | v2.1 names | v3.0 names |  
    | ccp | Point |  
    | ccpNeg | Point::- |  
    | ccpAdd | Point::+ |  
    | ccpSub | Point::- |  
    | ccpMult | Point::* |  
    | ccpMidpoint | Point::getMidpoint |  
    | ccpDot | Point::dot |  
    | ccpCrosss | Point::cross |  
    | ccpPerp | Point::getPerp |  
    | ccpRPerp | Point::getRPerp |  
    | ccpProject | Point::project |  
    | ccpRotate | Point::rotate |  
    | ccpUnrotate | Point::unrotate |  
    | ccpLengthSQ | Point::getLengthSq() |  
    | ccpDistanceSQ | Point::getDistanceSq |
     
    | ccpLength | Point::getLength |  
    | ccpDistance | Point::getDistance |  
    | ccpNormalize | Point::normalize |  
    | ccpForAngle | Point::forAngle |  
    | ccpToAngle | Point::getAngle |  
    | ccpClamp | Point::getClampPoint |  
    | ccpFromSize | Point::Point |  
    | ccpCompOp | Point::compOp |  
    | ccpLerp | Point::lerp |  
    | ccpFuzzyEqual | Point::fuzzyEqual |  
    | ccpCompMult | Point::Point |  
    | ccpAngleSigned | Point::getAngle |  
    | ccpAngle | Point::getAngle | 
    | ccpRotateByAngle | Point::rotateByAngle |  
    | ccpLineInersect | Point::isLineIntersect |  
    | ccpSegmentIntersect | Point::isSegmentIntersect |  
    | ccpIntersectPoint | Point::getIntersectPoint |  
    | CCPointMake | Point::Point |  
    | CCSizeMake | Size::Size |  
    | CCRectMake | Rect::Rect |  
    | PointZero | Point::ZERO |  
    | SizeZero | Size::ZERO |  
    | RectZero | Rect::ZERO |  
    | TiledGrid3DAction::tile | TiledGrid3DAction::getTile |  
    | TiledGrid3DAction::originalTile | TiledGrid3DAction::getOriginalTile |  
    | TiledGrid3D::tile | TiledGrid3D::getTile |  
    | TiledGrid3D::originalTile | TiledGrid3D::getOriginalTile |  
    | Grid3DAction::vertex | Grid3DAction::getVertex |  
    | Grid3DAction::originalVertex | Grid3DAction::getOriginalVertex |  
    | Grid3D::vertex | Grid3D::getVertex |  
    | Grid3D::originalVertex | Grid3D::getOriginalVertex |  
    | Configuration::sharedConfiguration | Configuration::getInstance |  
    | Configuration::purgeConfiguration | Configuration::destroyInstance() |  
    | Director::sharedDirector() | Director::getInstance() |  
    | FileUtils::sharedFileUtils | FileUtils::getInstance |  
    | FileUtils::purgeFileUtils | FileUtils::destroyInstance |  
    | EGLView::sharedOpenGLView | EGLView::getInstance |  
    | ShaderCache::sharedShaderCache | ShaderCache::getInstance |  
    | ShaderCache::purgeSharedShaderCache | ShaderCache::destroyInstance |  
    | AnimationCache::sharedAnimationCache | AnimationCache::getInstance |  
    | AnimationCache::purgeSharedAnimationCache | AnimationCache::destroyInstance |  
    | SpriteFrameCache::sharedSpriteFrameCache | SpriteFrameCache::getInstance |  
    | SpriteFrameCache:: purgeSharedSpriteFrameCache | SpriteFrameCache::destroyInstance |  
    | NotificationCenter::sharedNotificationCenter | NotificationCenter::getInstance |  
    | NotificationCenter:: purgeNotificationCenter | NotificationCenter::destroyInstance |  
    | Profiler::sharedProfiler | Profiler::getInstance |  
    | UserDefault::sharedUserDefault | UserDefault::getInstance |  
    | UserDefault::purgeSharedUserDefault | UserDefault::destroyInstance |  
    | Application::sharedApplication | Application::getInstance |  
    | ccc3() | Color3B() |  
    | ccc3BEqual() | Color3B::equals() |  
    | ccc4() | Color4B() |  
    | ccc4FFromccc3B() | Color4F() |  
    | ccc4f() | Color4F() |  
    | ccc4FFromccc4B() | Color4F() |  
    | ccc4BFromccc4F() | Color4B() |  
    | ccc4FEqual() | Color4F::equals() |  
    | ccWHITE | Color3B::WHITE |  
    | ccYELLOW | Color3B::YELLOW |  
    | ccBLUE | Color3B::BLUE |  
    | ccGREEN | Color3B::GREEN |  
    | ccRED | Color3B::RED |  
    | ccMAGENTA | Color3B::MAGENTA |  
    | ccBLACK | Color3B::BLACK |  
    | ccORANGE | Color3B::ORANGE |  
    | ccGRAY | Color3B::GRAY |  
    | kBlendFuncDisable | BlendFunc::BLEND_FUNC_DISABLE |


    cocos2d-x 常用类名改变

    下面的表格中的类名的转换方式主要是直接删除了 CC 前缀。

    # v2 v3
    1 CCAction Action
    2 CCPoint Point
    3 CCAnimation Animation
    4 CCSprite Sprite
    5 CCLabel Label
    6 CCMenu Menu
    7 CCObject Ref
    8 CCNode Node
    9 CCScene Scene
    10 CCLayer Layer
    11 CCSpriteBatchNoe SpriteBatchNode
    12 CCTMXTiledMap TMXTiledMap

    cocos2d-x 类名改变

    下面表格中的类名的转换就比较大了。

    # v2 v3
    1 CCDictionary ValueMap
    2 CCArray ValueVector
    3 CCString Value

    CCString 用法改变

    之前:

    CCString* str = CCString::createWithFormat("%s.png","picture");
    

    现在:

    std::string str = StringUtils::format("%s.png","picture");
    

    CCDictinoary 用法改变

    之前:

    CCDictionary* dict = CCDictionary::createWithContentsOfFile("name.plist");
    CCArray* arr = (CCArray*) data->objectForKey("Levels");
    

    现在:

    std::string path = FileUtils::getInstance()->fullPathForFilename("name.plist");
    ValueMap dict = FileUtils::getInstance()->getValueMapFromFile(path);
    ValueVector arrLevels = data.at("Levels").asValueVector();
    

    CCArray 用法改变

    这里就是 C++ vector 容器的标准用法了。

    # v2 v3
    1 CCArray* sprites; Vector sprites;
    2 sprites->addObject(sprite); sprites.pushBack(sprite);
    3 sprites->removeObject(sprite); sprites.eraseObject(sprite);
    4 sprites->removeObjectAtIndex(i); sprites.erase(i);
    5 sprites->objectAtIndex(i); sprites.at(i);
    6 sprites->count(); sprites.size();



    触摸用法改变

    # v2 v3
    1 ccTouchBegan onTouchBegan
    2 ccTouchMoved onTouchMoved
    3 ccTouchEnded onTouchEnded

    单例类用法改变

    # v2 v3
    1 CCEGLView::sharedOpenGLView(); Director::getInstance()->getOpenGLView();
    2 CCTextureCache::sharedTextureCache(); Director::getInstance()->getTextureCache();
    3 CCNotificationCenter::sharedNotificationCenter(); Director::getInstance()->getEventDispatcher();

    CCTime 用法改变

    CCTime cocos2d-x v3 中已经被删除了。

    # v2 v3
    1 cc_timeval timeval
    2 CCTime::gettimeofdayCocos2d gettimeofday
    3 CCTime::timesubCocos2d getTimeDiffenceMS

    范例:

    static inline float getTimeDifferenceMS(timeval& start, timeval& end)
    {
        return ((((end.tv_sec - start.tv_sec)*1000.0f + end.tv_usec) - start.tv_usec) / 1000.0f);
    }
    



    OpenGL 的用法变化

    # v2 v3
    1 CCGLProgram GLProgram
    3 kCCUniformPMatrix_s GLProgram::UNIFORM_NAME_P_MATRIX
    4 kCCUniformMVMatrix_s GLProgram::UNIFORM_NAME_MV_MATRIX
    5 kCCUniformMVPMatrix_s GLProgram::UNIFORM_NAME_MVP_MATRIX
    6 kCCUniformTime_s GLProgram::UNIFORM_NAME_TIME
    7 kCCUniformSinTime_s GLProgram::UNIFORM_NAME_SIN_TIME
    8 kCCUniformCosTime_s GLProgram::UNIFORM_NAME_COS_TIME
    9 kCCUniformRandom01_s GLProgram::UNIFORM_NAME_RANDOM01
    10 kCCUniformSampler_s GLProgram::UNIFORM_NAME_SAMPLER0
    11 kCCUniformAlphaTestValue GLProgram::UNIFORM_NAME_ALPHA_TEST_VALUE
    12 kCCAttributeNameColor GLProgram::ATTRIBUTE_NAME_COLOR
    13 kCCAttributeNamePosition GLProgram::ATTRIBUTE_NAME_POSITION
    14 kCCAttributeNameTexCoord GLProgram::ATTRIBUTE_NAME_TEX_COORD

    MenuItem 的用法变化

    在 cocos2d-x v3 中,使用的是 C++11 提供的标准的 std::bind 功能来实现回调。

    让我们看看 base/ccMacros.h 中的几个宏:

    // new callbacks based on C++11
    #define CC_CALLBACK_0(__selector__,__target__, ...) std::bind(&__selector__,__target__, ##__VA_ARGS__)
    #define CC_CALLBACK_1(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, ##__VA_ARGS__)
    #define CC_CALLBACK_2(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, ##__VA_ARGS__)
    #define CC_CALLBACK_3(__selector__,__target__, ...) std::bind(&__selector__,__target__, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, ##__VA_ARGS__)
    

    所以,对于 cocos2d-x v2 中这样的调用:

    CMenuItemImage *item1 = CCMenuItemImage::create(s_pPathB1, s_pPathB2, this, menu_selector(ActionsDemo::backCallback));
    

    在 cocos2d-x v3 中应该是这样的:

    MenuItemImage *item1 = MenuItemImage::create(s_pPathB1, s_pPathB2, CC_CALLBACK_1(ActionsDemo::backCallback, this));
    


    展开全文
  • cocos2d-x box2d 入门

    2014-03-04 17:33:53
    天天飞翔,物理特性用...cocos2d-x可以和box2d的C++版完美融合,集成起来很方便。 #include "Box2D.h" 包含进来就可以了。这里有个问题,cocos2d-x2.2.1版本NDK编译安卓版本的时候,需要改下,不然找不到box2d的头文件

    个人原创,欢迎转载http://blog.csdn.net/dawn_moon/article/details/20466245

    天天飞翔,物理特性用了box2d来做的。关于box2d的入门教程网上有很多,推荐官方手册,中文版,地址。我不再做重复介绍,稍微写点自己理解的东西。


    cocos2d-x可以和box2d的C++版完美融合,集成起来很方便。

    #include "Box2D.h"

    包含进来就可以了。这里有个问题,cocos2d-x2.2.1版本NDK编译安卓版本的时候,需要改下,不然找不到box2d的头文件。

    #include "Box2D/Box2D.h"

    开启box2d的debug渲染

    一般为了方便调试box2d,会将物理世界的物体绘制出来,官方有debug draw,cocos2dx里面有个debug的工具类GLESDebugDraw,在test工程里面,文件名GLES-Render.h,加入进来。

    步骤如下:

    1。需要有个box2d的物理世界b2World,一个debug渲染器,GLESDebugDraw。demo如下:

    //
    //  TestBox.h
    //  TestBox2d
    //
    //  Created by lerry on 14-3-4.
    //  Copyright (c) 2014年 GoonearTechnology Co.,Ltd. All rights reserved.
    //
    
    #ifndef __TestBox2d__TestBox__
    #define __TestBox2d__TestBox__
    
    #include "cocos2d.h"
    #include "Box2D.h"
    #include "GLES-Render.h"
    
    #define RATIO 96
    
    class TestBox : public cocos2d::CCLayer
    {
        cocos2d::CCSprite* role;
        b2World* mWorld;
        
        GLESDebugDraw* mDebugDraw;
        
        cocos2d::CCSize visualSize;
        
        
    private:
        void draw();
        
        void drawBox();
        
    public:
        
        ~TestBox();
        virtual void update(float dt);
        
        virtual bool init();
        
        virtual void onEnter();
        virtual void onExit();
        
        virtual bool ccTouchBegan(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
        virtual void ccTouchMoved(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
        virtual void ccTouchEnded(cocos2d::CCTouch* touch, cocos2d::CCEvent* event);
        
        void initWorld();
        
        void setDebug(bool isDebug);
        
        static cocos2d::CCScene* scene();
        
        CREATE_FUNC(TestBox);
        
        
    };
    
    #endif /* defined(__TestBox2d__TestBox__) */
    

    2。构建世界,构建世界盒子,开启debug模式
    void TestBox::initWorld()
    {
        mWorld = new b2World(b2Vec2(0, -10));
        mWorld->SetAllowSleeping(true);
        mWorld->SetContinuousPhysics(true);
        
        setDebug(true);
    }
    3。如果开启debug模式,启用debug绘制

    void TestBox::setDebug(bool isDebug)
    {
        if (isDebug) {
            mDebugDraw = new GLESDebugDraw(RATIO);
            mWorld->SetDebugDraw(mDebugDraw);
            
            uint32 flags = 0;
            flags += b2Draw::e_shapeBit;
            flags += b2Draw::e_jointBit;
            flags += b2Draw::e_pairBit;
            flags += b2Draw::e_centerOfMassBit;
            mDebugDraw->SetFlags(flags);
            draw();
            
        }
    }
    
    void TestBox::draw()
    {
        ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
        
        kmGLPushMatrix();
        
        mWorld->DrawDebugData();
        
        kmGLPopMatrix();
    }
    
    4.init里面初始化世界,调用update函数即可。

    代码如下:

    //
    //  TestBox.cpp
    //  TestBox2d
    //
    //  Created by lerry on 14-3-4.
    //  Copyright (c) 2014年 GoonearTechnology Co.,Ltd. All rights reserved.
    //
    
    #include "TestBox.h"
    
    USING_NS_CC;
    
    TestBox::~TestBox()
    {
        delete mWorld;
        mWorld = NULL;
        delete mDebugDraw;
        mDebugDraw = NULL;
    }
    
    CCScene* TestBox::scene()
    {
        CCScene* s = CCScene::create();
        TestBox* test = TestBox::create();
        s->addChild(test);
        return s;
    }
    
    bool TestBox::init()
    {
        if(!CCLayer::init())
        {
            return false;
        }
        
        visualSize = CCDirector::sharedDirector()->getVisibleSize();
        
        initWorld();
        
        drawBox();
        
        scheduleUpdate();
        return true;
    }
    
    void TestBox::update(float dt)
    {
        int velocityIterat = 8;
        int positionIterat = 1;
        mWorld->Step(dt, velocityIterat, positionIterat);
        
        for(b2Body *b=mWorld->GetBodyList(); b; b=b->GetNext())
        {
            if(b->GetUserData()!=NULL)
            {
                CCSprite *sprite=(CCSprite*)b->GetUserData();
                
                sprite->setPosition(ccp(b->GetPosition().x*RATIO,b->GetPosition().y*RATIO));
                sprite->setRotation((-1)*CC_RADIANS_TO_DEGREES(b->GetAngle()));
            }
        }
    }
    
    void TestBox::drawBox()
    {
        
        {   // 地板
            b2Body* ground = NULL;
            b2BodyDef bd;
            ground = mWorld->CreateBody(&bd);
            
            // 底边
            b2EdgeShape shape;
            shape.Set(b2Vec2(0.1f, 0.1f), b2Vec2(visualSize.width / RATIO - 0.1f, 0.1f));
            ground->CreateFixture(&shape, 0.0f);
            
            shape.Set(b2Vec2(0.1f, 0.1f), b2Vec2(0.1f, visualSize.height / RATIO - 0.1f));
            ground->CreateFixture(&shape, 0.0f);
            
            shape.Set(b2Vec2(0.1f, visualSize.height / RATIO - 0.1f), b2Vec2(visualSize.width / RATIO - 0.1f, visualSize.height / RATIO - 0.1f));
            ground->CreateFixture(&shape, 0.0f);
            
            shape.Set(b2Vec2(visualSize.width / RATIO - 0.1f, 0.1f), b2Vec2(visualSize.width / RATIO - 0.1f, visualSize.height / RATIO - 0.1f));
            ground->CreateFixture(&shape, 0.0f);
            
        }
        
        {
            role = CCSprite::create("poop_1.png");
            CCSize size = role->getContentSize();
            role->setPosition(ccp(visualSize.width / 2, visualSize.height / 2));
            
            b2BodyDef bodyDef;
            bodyDef.type = b2_dynamicBody;
            bodyDef.userData = role;
            bodyDef.position.Set(visualSize.width / 2 / RATIO, visualSize.height / 2 / RATIO);
            b2Body* body = mWorld->CreateBody(&bodyDef);
            
            
            b2PolygonShape shape;
            shape.SetAsBox(size.width / 2 / RATIO, size.height / 2 / RATIO);
            b2FixtureDef fixDef;
            fixDef.shape = &shape;
            body->CreateFixture(&fixDef);
            
            addChild(role);
    
            
        }
    
    }
    
    void TestBox::initWorld()
    {
        mWorld = new b2World(b2Vec2(0, -10));
        mWorld->SetAllowSleeping(true);
        mWorld->SetContinuousPhysics(true);
        
        setDebug(true);
    }
    
    void TestBox::setDebug(bool isDebug)
    {
        if (isDebug) {
            mDebugDraw = new GLESDebugDraw(RATIO);
            mWorld->SetDebugDraw(mDebugDraw);
            
            uint32 flags = 0;
            flags += b2Draw::e_shapeBit;
            flags += b2Draw::e_jointBit;
            flags += b2Draw::e_pairBit;
            flags += b2Draw::e_centerOfMassBit;
            mDebugDraw->SetFlags(flags);
            draw();
            
        }
    }
    
    void TestBox::draw()
    {
        ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position );
        
        kmGLPushMatrix();
        
        mWorld->DrawDebugData();
        
        kmGLPopMatrix();
    }
    
    bool TestBox::ccTouchBegan(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
    {
        CCLog("touch");
        
        return true;
    }
    
    void TestBox::ccTouchMoved(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
    {
        
    }
    
    void TestBox::ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent *event)
    {
        
    }
    
    void TestBox::onEnter()
    {
        CCDirector* pDirector = CCDirector::sharedDirector();
        pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
        CCLayer::onEnter();
    }
    
    void TestBox::onExit()
    {
        CCDirector* pDirector = CCDirector::sharedDirector();
        pDirector->getTouchDispatcher()->removeDelegate(this);
        CCLayer::onExit();
    }
    

    是不是感觉没什么注释啊,好的代码不需要注释大笑

    展开全文
  • Box2D的基本使用方法
  • box2d的debugDraw准备工作box2d显示debugDraw困扰了我很久,查了很多资料都没有显示,今天在朋友的帮助下终于显示成功了。
  • cocos2dx】box2d使用

    2017-04-21 13:18:39
    刚开始xcode莫名其妙的报错误,提示box2d没有开启,主要有两个地方需要设置,在targets->buidseting->preprocessing中设置CC_ENABLE_BOX2D_INTEGRATION=1删除climuk,project->buidseting->preprocessing同样但是对于...
  • 众所周知, box2d的DrawDebugData函数绘制默认不是放在最前面的, 为了达到这个要求, v2版代码很简单v2:void Box2dManager::draw(){ ccGLEnableVertexAttribs( kCCVertexAttribFlag_Position ); kmGLPushMatrix(); ...
  • Cocos3.xCocos2.x的区别

    2017-08-03 13:44:17
    【v3.0 亮点】  > 使用 C++(C++11) 的特性取代了 Objective-C 的特性  > 优化了 Labels  > 优化了渲染器(比 v2.2 更快)  > 新的事件分发机制  > 物理引擎集成 ... > 使用 cocos2d::Map 替代了 CCDic
  • cocos2dx 3.x使用Box2d

    2017-04-09 16:23:15
    众所周知cocs2dx 3.x中有个Physics的封装,本意可能是想同时封装chipmunk和box2d,但为什么只实现了chipmunk就不管box2d了呢。。 最近尝试了一下,chipmunk问题很多,只要PhysicsBody速度够快,即便是和staticBody...
  • 这里说下我用VS2013在cocos2d-x3.2测试Box2D遇到的一些问题,持续更新。 一、编译没问题,运行时报错(我用的到了cocos封装的物理引擎绑定的物理精灵,在libExtensions中)。 解决办法:可能是在引用的库中没有...
  • 在现存的COCOS2D项目(下称项目a)中,如果需要添加BOX2D框架,需要按如下步骤进行: 0.新建一个COCOS2D+BOX2D的项目 temp ,并在建立的项目目录下的/libs目录里找到BOX2D目录。 1.把BOX2D目录整个COPY到项目a...
  • cocos2d-x Box2d 入门例子

    2014-04-10 15:18:14
    1.效果图(动态的gif见底部):   ...cocos2d-x ... Touch 事件应用的一个例子 球跟...这次我们要改用物理引擎Box2d来让球碰撞!先下载这个项目,打开Release.win32/Air Hockey.win32.exe先来个试玩吧。   2.B
  • COCOS2D-X ANDROID BOX2D

    2014-10-09 16:55:38
    找不到头文件 LOCAL_WHOLE_STATIC_LIBRARIES += cocos_extension_static box2d_static $(call import-module,Box2D)
  • 虽然是英文网页,但是教程简单明了,看过之后cocos2d中的box2d用法将一目了然。所以值得收藏学习。 转自:http://www.codeandweb.com/blog/2011/03/26/cocos2d-box2d Tutorial: cocos2d + box2d PhysicsEditor ...
  • Cocos2d-X Box2D内容讲解

    2014-09-29 16:18:57
    一、box2d基础知识 1、关于  Box2D 是一个用于游戏的 2D 刚体仿真库。从游戏的视角来看,物理引擎就是一个程序性动画(procedural animation)的系统,而不是由动画师去移动你的物体。 1、核心概念  ...
  • cocos中的Box2d物理引擎

    2016-01-22 17:29:06
    一些Box2d的基本概念,一些cocos中使用box2d需要注意的地方 1. cocos2d 自带了两套物理引擎:Box2D 和Chipmunk。 两套引擎都是为2D游戏设计的,可以和cocos2d 完美整合。 Box2D 是用 C++写的,而 Chipmunk 用...
  • cocos2d-x 2.x LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := cocos2dcpp_shared LOCAL_MODULE_FILENAME := libcocos2dcpp define walk $(wildcard $(1)) $(foreach e, $
  • cocos2dx 无法导入Box2D.h

    2019-07-10 06:03:12
    将#include "Box2D.h" 换成#include "Box2D/Box2D.h" 转载于:https://www.cnblogs.com/yufenghou/p/3738192.html
1 2 3 4 5 ... 20
收藏数 7,833
精华内容 3,133