cocos2d-x 物理引擎Box2D

本文介绍了如何在cocos2d-x游戏开发中使用Box2D物理引擎,包括创建世界、定义不同类型的刚体、设置形状、关联属性以及创建和管理连接。示例代码详细展示了如何初始化世界、创建静态和动态刚体、添加矩形和圆形形状,并通过tick方法更新世界状态。
摘要由CSDN通过智能技术生成

基本类

世界(b2World)

代表一个遵守物理定律的空间,创建世界时先创建重力向量,再根据重力向量产生世界。

刚体

只有位置没有大小的质点,具体分为三种

1、静态刚体(Static Body):静态刚体没有质量也没有速度,只能通过代码来改变其位置。

2、棱柱刚体(Prismatic Body):棱柱刚体没有质量,但是有速度,引擎根据速度更行器位置。

3、动态刚体(Dynamic Body):动态刚体既有质量也有速度,是最常用的刚体类型。

首先创刚体定义,然后再使用世界对象创建刚体。

注:Box2D创建描述对象时必须首先创建一个对象的描述(定义)类,在根据定义类创建具体对象。创建完对象以后定义对象可以重用,不需要使用定义对象时要及时释放。

       b2BodyDef def ; //创建刚体定义

       def.position.Set(0.0f,0.0f); //设置位置

       b2Body* body = world->CreateBody(&def);//使用世界和刚体定义创建一个刚体对象

形状

形状通过关联附加到刚体上,使得刚体具有肉眼是别的几何形状,刚体可以附加多个形状称为组合形状。

//生成一个矩形形状

b2PolygonShap shap;

shap.SetAsBox(5.0f,5.0f);


关联和关联定义

关联是一种附加在刚体上的属性,一个刚体可以附加多个关联,比如形状,密度,反弹力,摩擦系数等。创建一个关联之前必须先创建一个关联定义,关联定义可以重用,关联定义需要释放。

b2FixtureDef def;//创建关联定义

def.shap = &shap;//关联形状

def.density = 1.0f;//关联密度

def.friction  = 0.8f;//关联摩擦力

def..restitution = 1.09f; //关联反弹洗漱

b2Fixture* fixture = body->CreateFixture(&def);  //创建一个关联对象,并且使得刚体产生关联


  

连接

连接用来连接多个刚体,使得他们之间产生相互的影响


废话到此结束,上代码


头文件

#include "cocos2d.h"
#include <Box2D/Box2D.h>
class WorldLayerSence : public cocos2d::CCLayer
{
public:
    //初始化
    virtual bool init();
    //产生场景对象
    static cocos2d::CCScene* scene();
    CREATE_FUNC(WorldLayerSence);
    void WorldLayerSence::tick(float time);
    void WorldLayerSence:: createTrangBody(
        b2World* world,const char* name);
private:
    //世界
    b2World* m_world;
    //刚体
    b2Body* m_body;
    //篮球
    cocos2d::CCSprite* m_ball;
};

主文件

#include "GameOverSence.h"
#include <iostream>
#include <sstream>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include "WorldLayerSence.h"
#include <cocos2d.h>
#include <Box2D/Box2D.h>
USING_NS_CC;
using namespace std;
#define PTM_RATIO 32.0 //像素到米的转换


bool WorldLayerSence::init()
{
    bool bRet = false;
    //  do
    //  {
    CCLayer::init();
    CCSize size =
        CCDirector::sharedDirector()->getVisibleSize();
    //1.创建篮球精灵
    m_ball =CCSprite::create("ball.png");
    m_ball->setPosition(ccp(size.width/2,
                            size.height-m_ball->getContentSize().height));
    m_ball->setTag(1);
    addChild(m_ball);
    //2.创建世界
    b2Vec2 gravity(0.0,-10.0);
    //创建重力 横向无重力,纵向重力向下,重力加速度为10
    m_world = new b2World(gravity);
    //地面空间刚体定义
    b2BodyDef groupBodyDef;
    groupBodyDef.position.Set(0.0f,0.0f);
    //根据刚体定义生成刚体
    b2Body* groundBody = m_world->CreateBody(
                             &groupBodyDef);
    //生成形状
    b2EdgeShape groundBox;
    //关联定义
    b2FixtureDef boxShapeDef;
    boxShapeDef.shape = &groundBox;
    //设置形状属性,下边框
    groundBox.Set(b2Vec2(0.0f,0.0f),
                  b2Vec2(size.width/PTM_RATIO,0));
    //创建关联
    groundBody->CreateFixture(&boxShapeDef);
    //设置形状属性 ---左边框
    groundBox.Set( b2Vec2(0.0f,0.0f),b2Vec2(0,
                                            size.height/PTM_RATIO) );
    //创建关联
    groundBody->CreateFixture(&boxShapeDef);
    //设置形状属性 ---上边框
    groundBox.Set( b2Vec2(0.0f,size.height/PTM_RATIO),
                   b2Vec2(size.width/PTM_RATIO,
                          size.height/PTM_RATIO) );
    //创建关联
    groundBody->CreateFixture(&boxShapeDef);
    //设置形状属性 --右边框
    groundBox.Set( b2Vec2(size.width/PTM_RATIO,
                          size.height/PTM_RATIO),
                   b2Vec2(size.width/PTM_RATIO,0.0f) );
    //创建关联
    groundBody->CreateFixture(&boxShapeDef);
    //创建篮球刚体与形状
    b2BodyDef ballBodyDef;
    ballBodyDef.type =b2_dynamicBody;
    ballBodyDef.position.Set(size.width/2/PTM_RATIO,
                             (size.height
                              -m_ball->getContentSize().height)/PTM_RATIO);
    //关联篮球精灵
    ballBodyDef.userData = m_ball;
    //创建篮球刚体
    m_body = m_world->CreateBody(&ballBodyDef);
    //生成形状
    b2CircleShape circle;
    circle.m_radius = 13.0/PTM_RATIO;
    //关联定义
    b2FixtureDef ballShapeDef;
    ballShapeDef.shape = &circle;
    //密度
    ballShapeDef.density = 120.0f;
    //摩擦力
    ballShapeDef.friction = 1.0f;
    //反弹系数
    ballShapeDef.restitution = 1.09f;
    m_body->CreateFixture(&ballShapeDef);
    //创建其他刚体
    createTrangBody(m_world,"tran.png");
    createTrangBody(m_world,"x.png");
    createTrangBody(m_world,"ball.png");
    createTrangBody(m_world,"ball.png");
    createTrangBody(m_world,"ball.png");
    createTrangBody(m_world,"ball.png");
    createTrangBody(m_world,"ball.png");
    this->schedule(schedule_selector(
                       WorldLayerSence::tick));
    bRet = true;
    //  }
    //  while (0);
    return bRet;
}
void WorldLayerSence:: createTrangBody(
    b2World* world,const char* name)
{
    CCSize size =
        CCDirector::sharedDirector()->getVisibleSize();
    float x = rand()*100%(int)size.width/2;
    float y = rand()*100%(int)size.height/2;
    //1、创建精灵
    CCSprite* spritTrang =
        CCSprite::create(name);
    spritTrang->setPosition(ccp(x,y));
    spritTrang->setTag(2);
    addChild(spritTrang);
    //1创建刚体定义
    b2BodyDef trangBodyDef;
    trangBodyDef.userData =
        spritTrang;//刚体关联精灵
    //刚体定义位置
    trangBodyDef.position.Set(x/PTM_RATIO,
                              y/PTM_RATIO);
    trangBodyDef.type=
        b2_dynamicBody;//刚体种类,动态刚体
    //2根据刚体定义产生刚体
    b2Body* trangBody = world->CreateBody(
                            &trangBodyDef);
    //3、赋予形状
    b2PolygonShape shape;
    shape.SetAsBox(
        spritTrang->getContentSize().width/2/PTM_RATIO,
        spritTrang->getContentSize().height/2/PTM_RATIO);
    //4、定义关联
    b2FixtureDef def;
    def.shape = &shape; //关联形状
    def.density = 1.5; //关联密度
    def.restitution = 0.99999; //关联反弹系数
    def.friction = 1; //关联摩擦力
    //设置关联
    trangBody->CreateFixture(&def);
}


void WorldLayerSence::tick(float time)
{
    //世界步
    m_world->Step(time,10,10);
    //获取世界的里的刚体
    for ( b2Body* body = m_world->GetBodyList();
            body!=NULL; body=body->GetNext() )
    {
        //获取篮球精灵
        if (body->GetUserData())
        {
            //根据刚体的位置设置篮球精灵的位置
            CCSprite* ballSprite = (CCSprite*)
                                   body->GetUserData();
            ballSprite->setPosition( ccp(
                                         body->GetPosition().x*PTM_RATIO,
                                         body->GetPosition().y*PTM_RATIO) );
            ballSprite->setRotation( -1*CC_RADIANS_TO_DEGREES(
                                         body->GetAngle()) );
        }
    }
}
cocos2d::CCScene* WorldLayerSence::scene()
{
    CCScene* scene = CCScene::create();
    WorldLayerSence* layer =
        WorldLayerSence::create();
    layer->setTag(100);
    scene->addChild(layer);
    return scene;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值