cocos2dx box2d使用(一)

出处:https://www.evernote.com/shard/s262/sh/bf561bda-0458-4502-835b-903846f81d68/68e6634bddec74c5a2d5f8dd839eba0a

本例子使用的是cocos2d-x 3.0版本

  1. 首先创建一个cocos2d的c++工程,这里就不多做说明了!本例子的项目名称是MyGame

  2. 其次,在MyGame的工程设置里Build
    Settings下,把CC_ENABLE_CHIPMUNK_INTEGRATION=1改为CC_ENABLE_BOX2D_INTEGRATION=1,同样把项目所引入的cocos2d的工程里改一下,但cocos2d的工程修改的地方有点特别!如上图的工程,非target!

  3. 到此,box2d的环境已经设定好了!

现在工程已经创建完成了,环境也设定好了,下代码工程:

创建一个layer,用于放置所有的box2d对像和项目的精灵

其中的头文件如下:

//
// 
Box2dTest.h
// 
MyGame
//
// 
Created by Poche on
5/17/14.
//
//

#ifndef
__MyGame__Box2dTest__
#define
__MyGame__Box2dTest__

#include "cocos2d.h"
#include "Box2D/Box2D.h"

class Box2dTest
: public cocos2d::Layer {
public:
   
Box2dTest();
    virtual ~Box2dTest();
    CREATE_FUNC(Box2dTest);
   
    /**
    
*@brief初始化box2d测试layer,box2d世界是独立于cocos的scene的
    
*
     *@Modified by poche at 2014-05-18
18:00:17
     *
    
*@return是否初始化成功
   
**/
    bool init();
    /**
    
*@brief初始化box2d世界
    
*
     *@Modified by poche at 2014-05-18
18:01:43
   
**/
    void initWorld();
private:
    b2World *m_world;
  ///
box2d世界
    ///
layer上的点击加调
    CC_SYNTHESIZE_RETAIN(cocos2d::EventListenerTouchAllAtOnce*, m_touchListener,_touchListener);
public:
    /**
    
*@brief添加精灵到指定坐标
    
*
     *@Modified by poche at 2014-05-18
18:02:44
     *@param
point 坐标
   
**/
    void AddSprite(cocos2d::Point point);
    /**
    
*@brief每帧检查box2d物体并且更新cocos的精灵的状态(位置等)
    
*
     *@Modified by poche at 2014-05-18
18:03:25
     *@param
dt 时间间隔
   
**/
    void update(float dt);
    /**
    
*@brief添加点击回调事件
    
*
     *@Modified by poche at 2014-05-18
18:04:39
   
**/
    void addLayerTouchListener();
    /**
    
*@brief点击结束后的加调方法
    
*
     *@Modified by poche at 2014-05-18
18:04:56
     *@param
touches 点击集合
     *@param
event 事件类型
   
**/
    void touchesEnd(const std::vector<cocos2d::Touch*>
touches, cocos2d::Event *event);
    virtual void onExit();
};

#endif /*
defined(__MyGame__Box2dTest__) */

下面看一下.cpp的代码:

//
// 
Box2dTest.cpp
// 
MyGame
//
// 
Created by Poche on
5/17/14.
//
//

#include "Box2dTest.h"
USING_NS_CC;

/// 在box2d里,其用到的单位是现实中的单位,米等
/// 所以在游戏里,我们需要作出转换
/// 在cocos2d里,每32个像素就相当box2d里的一米
#define
PTM_RATIO 32

const int tagSprite
= 1;

Box2dTest::Box2dTest()
: m_touchListener(NULL)
{
   
}

Box2dTest::~Box2dTest()
{
    CC_SAFE_RELEASE(m_touchListener);
    /// 记得移除对像,要不然会泄露
    delete m_world;
    m_world = NULL;
}

bool Box2dTest::init()
{
    /// 添加点击响应
    addLayerTouchListener();
    /// 初始化世界
    initWorld();
    return true;
}
void Box2dTest::initWorld()
{
   
    auto size
= Director::getInstance()->getWinSize();
    /// 设置box2d世界重力方向
    b2Vec2 gravity(0.0f,
-10.0f);
    bool doSleep   
= true;
   
    /// 生成box2d世界
    m_world = new b2World(gravity);
    /// 是否允许睡眠
    m_world->SetAllowSleeping(doSleep);
    m_world->SetContinuousPhysics(true);
   
    /// 地表物体定义
    b2BodyDef groundBodyDef;
    /// 通过地表物体定义生成地表物体
    b2Body*
groundBody 
= m_world->CreateBody(&groundBodyDef);
    /// 形状
    b2PolygonShape groundBox;
   
    /// 作为box形态布局
    /// 第一个参数  物体的宽
    /// 第二个参数  物体的高
    /// 第三个参数  物体的位置
    /// 第四个参数  物体中角度
    /// 墙底
   
groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0, 0), 0);
    /// 把已经生成的物体放入世界中
    /// 第一个参数  要放入的物体
    /// 第二个参数  物体的质量
   
groundBody->CreateFixture(&groundBox, 0);
    /// 墙顶
   
groundBox.SetAsBox(size.width / PTM_RATIO, 0, b2Vec2(0,
size.height / PTM_RATIO), 0);
   
groundBody->CreateFixture(&groundBox, 0);
    /// 左墙
   
groundBox.SetAsBox(0,
size.height / PTM_RATIO, b2Vec2(0, 0), 0);
   
groundBody->CreateFixture(&groundBox, 0);
    /// 左墙
   
groundBox.SetAsBox(0,
size.height / PTM_RATIO, b2Vec2(size.width / PTM_RATIO, 0), 0);
   
groundBody->CreateFixture(&groundBox, 0);
   
    ///
cocos2d里的精灵
    auto brick 
= SpriteBatchNode::create("CloseNormal.png");
    addChild(brick, 2, tagSprite);
   
    /// 每帧对cocos2d的精灵更新
    schedule(schedule_selector(Box2dTest::update));
}

void Box2dTest::AddSprite(cocos2d::Point point)
{
    auto batch =
(SpriteBatchNode*)getChildByTag(tagSprite);
   
    auto sprite
= Sprite::createWithTexture(batch->getTexture(), Rect(0,0,32,32));
   
batch->addChild(sprite);
   
   
sprite->setPosition(Point(point.x,
point.y));
   
    /// 创建动态物体
    /// 物体定义
    b2BodyDef bodyDef;
    /// 物体为动态物体
   
bodyDef.type = b2_dynamicBody;
    /// 物体的位置
   
bodyDef.position.Set(point.x / PTM_RATIO,
point.y/ PTM_RATIO);
    /// 将已经生成的精灵捆绑到物体上
   
bodyDef.userData =
sprite;
    /// 创建物体
    b2Body *
body
= m_world->CreateBody(&bodyDef);
   
    b2PolygonShape dynamicBox;
   
dynamicBox.SetAsBox(0.5f, 0.5f);
   
    b2FixtureDef fixtureDef;
   
fixtureDef.shape =
&dynamicBox;
    /// 设置摩擦系数
   
fixtureDef.friction = 0.3f;
    /// 设置密度
   
fixtureDef.density = 1.0;
   
body->CreateFixture(&fixtureDef);
}

void Box2dTest::update(float dt)
{
    int velocityIterations
= 8;
    int positionIterations
= 1;
   
    //每次游戏循环你都应该调用b2World::Step
    m_world->Step(dt,
velocityIterations,
positionIterations);
   
   
    for(b2Body*
b
= m_world->GetBodyList();
b; b = b->GetNext())
   
{
        if(b->GetUserData()
!= NULL)
       
{
            /// 更新cocos2d对像
            auto sprite
=
(Sprite*)b->GetUserData();
           
sprite->setPosition(Point(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO));
           
sprite->setRotation(
-1 * CC_RADIANS_TO_DEGREES(b->GetAngle())
);
        }
   
}
}

void Box2dTest::addLayerTouchListener()
{
    set_touchListener(EventListenerTouchAllAtOnce::create());
    get_touchListener()->onTouchesEnded = CC_CALLBACK_2(Box2dTest::touchesEnd, this);
    _eventDispatcher->addEventListenerWithSceneGraphPriority(get_touchListener(), this);
   
}

void Box2dTest::onExit()
{
    Layer::onExit();
    unschedule(schedule_selector(Box2dTest::update));
    _eventDispatcher->removeEventListener(get_touchListener());
}

void Box2dTest::touchesEnd(const std::vector<cocos2d::Touch *>
touches, cocos2d::Event *event)
{

    for (auto&
touch : touches)
   
{
        auto location
=
touch->getLocationInView();
       
location
= Director::getInstance()->convertToGL(location);
       
        AddSprite(location);
   
}
}

解释:

在这里要说说box2d中的单位,由于box2d中使用的是米作为长度单位。但在编程中,我们使用的图片都是使用像素作为基本单位。

凡是要向世界对象中添加物体的,都需要将像素单位转化为米单位。凡是要将世界对象中的物体显示在屏幕上时,要将物体的米单位转化为像素单位,在cocos2d里,大多用到的32个像素为一米,能否改就不得而知了!

SetAsBox 函数接收了半个宽度和半个高度,这样的话,地面盒就是 100 个单位宽(x 轴)以及 20 个单位高(y 轴)。Box2D
已被调谐使用米,千克和秒来作单位,所以你可以用米来考虑长度。然而,
改变单位系统是可能的。

cocos2dx box2d使用(一),布布扣,bubuko.com

时间: 2024-10-10 01:30:10

cocos2dx box2d使用(一)的相关文章

基于Cocos2dx + box2d 实现的愤慨的小鸟Demo

1. Demo初始界面 2. 游戏界面 3. 精确碰撞检測 4. 下载  压缩文件文件夹 AngryBird source    愤慨的小鸟Demo源码,基于Cocos2dx C++,以及box2d技术. run 可运行程序文件夹 点击打开链接

mac下面xcode+ndk7配置cocos2dx &amp; box2d的跨ios和android平台的游戏教程

这篇教程是介绍如何使用cocos2d-x和box2d来制作一个demo,且此demo能同时运行于ios和android平台.在继续阅读之前,建议您先阅读上一篇教程. 首先,按照上一篇教程,搭建好mac下面的cocos2dx和android开发环境,注意配置好一些环境变量的值,比如$COCOS2DX_ROOT等.然后使用Xcode建立一个cocos2dx_box2d项目,命名为Box2DTest,如下图所示: 然后,还是和之前一样,用cocos2dx安装目录下的脚本来创建一个android工程,我

cocos2d-x box2d Demo注解

勤奋努力,持之以恒. 核心概念 Box2D 中有一些主要的对象,这里我们先做一个简要的定义,在随后的文档里会有更具体的描写叙述. 刚体(rigid body) 一块十分坚硬的物质,它上面的不论什么两点之间的距离都是全然不变的. 它们就像钻石那样坚硬. 在后面的讨论中,我们用物体(body)来取代刚体. 形状(shape) 一块严格依附于物体(body)的 2D 碰撞几何结构(collision geometry). 形状具有摩擦(friction)和恢复(restitution)的材料性质. 约

Cocos2d-x Box2D物理引擎编译设置

找到解决方案TestCpp工程.打开其属性=>C/C++ =>预处理器==>处理器定义. 参加"CC_ENABLE_BOX2D_INTEGRATION=1", 更改"CC_ENABLE_CHIPMUNK_INTEGRATION=0", 打开libExtensions项目相同找到预处理器定义, 加入"CC_ENABLE_BOX2D_INTEGRATION=1" , 删除"CC_ENABLE_CHIPMUNK_INTEGR

Cocos2dx集成于windows桌面窗口程序的步骤

2D游戏需要做编辑器,而编辑器总是希望可以复用游戏中的逻辑来运行场景试看效果. 对于cocos2dx开发的程序,这个需求可以描述为: 实现一种方法,在桌面窗口程序中的某个控件上显示cocos2dx的场景,而其他部分保持该操作系统原生ui的功能. 这里以windows桌面程序为例,描述如何实现这一点,cocos2dx版本为2.2.5 代码用qt实现,但是没有用到太多qt的东西,windows api通用. 1 创建工程.这里我们依然使用cocos2dx提供的工程生成器创建工程,以得到完美的coco

台球游戏的核心算法和AI(1)

前言: 08年的时候, 写过一个台球游戏, 用的是java, 不过代码真的是用传说中的神器notepad写的(你信吗? 其实是用GVIM写的, ^_^), 很多类都在同一java文件中编写. 可见当时的JAVA水平真的不咋地, 时过进迁, 还是一样的不咋地. 这边是当时的CSDN下载链接: java(台球游戏), 实现比较简单. 后来写过一个版本, 比这个要强大许多, 可惜源码丢失了. 效果展示入下图所示: 本文想讲述下台球游戏中核心算法的实现, 以及游戏AI的设计技巧. 当然自己也有个小愿望,

实例介绍Cocos2d-x中Box2D物理引擎:HelloBox2D

我们通过一个实例介绍一下,在Cocos2d-x 3.x中使用Box2D物理引擎的开发过程,熟悉这些API的使用.这个实例运行后的场景如图所示,当场景启动后,玩家可以触摸点击屏幕,每次触摸时候,就会在触摸点生成一个新的精灵,精灵的运行自由落体运动. HelloBox2D实例 使用Box2D引擎进行开发过程,如图12-15所示.下面我们就按照这个步骤介绍一下代码部分.首先看一下看HelloWorldScene.h文件,它的代码如下: [html] view plaincopy #ifndef __H

Cocos2d-x 3.1.1 学习日志10--一进来你就知道了Box2D了

error LNK2019: 无法解析的外部符号 "public: __thiscall b2Draw::b2Draw(void)" ([email protected]@[email protected]),该符号在函数 "public: __thiscall GLESDebugDraw::GLESDebugDraw(float)" ([email protected]@[email protected]@Z) 中被引用 _thiscall b2World::~b

【极客学院出品】Cocos2d-X系列课程之九-BOX2D物理引擎

Cocos2d-x 是时下最热门的手游引擎,在国内和国外手机游戏开发使用的份额各自是70%和25%,在App Store的top10中,有7个是用它开发的. 本节课程为Cocos2d-x系列课程之九,学习BOX2D物理引擎! 学习路径图: 课程适合小白系统学习,仅需6个课时,在极客学院首席讲师风趣幽默的课程里轻松掌握BOX2D物理引擎.恭喜你也从此将走上为牛X程序员的不归路. 今年上午9点正式上线,请别再期待娱乐圈的新闻了,马上開始学习吧>>> 我们还有很多其它更新更实战的课程,登录极客