基本类
世界(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;
}