cocos2dx自学之使用box2d物理世界

需要引入的头文件

#include "cocos2d.h"
#include "Box2D\Box2D.h"
#include <string>


创建物理世界

world = new b2World(b2Vec2(0,-10));

创建会自由掉落的 精灵

bird = Sprite::create("bird0_0.png");
	bird->setName("bird");
	Size size = bird->getContentSize();
	b2BodyDef def;
	def.type = b2_dynamicBody;
	def.position = b2Vec2(screenSize.width / 4 / RATIO, screenSize.height / 2 / RATIO + 1);//鸟的位置
	b2PolygonShape shape;
	shape.SetAsBox(size.width/2/RATIO,size.height/2/RATIO); //碰撞体积?
	b2FixtureDef fixtureDef;
	fixtureDef.density = 1;
	fixtureDef.friction = 0.3;
	fixtureDef.shape = &shape;
	b2Body *body = world->CreateBody(&def);
	body->CreateFixture(&fixtureDef);
	addChild(bird);
	bird->setPosition(Point(def.position.x*RATIO, def.position.y*RATIO));//物理物体会自动往下掉 因此绑定物理物体的位置到sprite上 就形成了物理
	body->SetUserData(bird);//与sprite绑定
	this->body = body;


必须将精灵与物理盒子绑定才能实现物理效果   此方法必须每秒执行,不停的将精灵与物理盒子位置绑定

void HelloWorld::bingSprite(){ //让物理盒子和精灵实时绑定来达到物理效果 物理盒子本身是看不到的
	Sprite *s;
	for (b2Body *b = world->GetBodyList(); b; b = b->GetNext()){
		s = (Sprite*)b->GetUserData();
		if (b->GetUserData() && b->GetType() == b2_dynamicBody||b->GetType()==b2_kinematicBody){
			if (s != NULL){
				s->setPosition(b->GetPosition().x*RATIO, b->GetPosition().y*RATIO);//每次渲染都让sprite与box body保持位置绑定
			}
			
		}
	}
}



添加道路物体  精灵下落时会落在上面

Sprite *ground = Sprite::create("land.png");
	Size size = ground->getContentSize();
	ground->setScaleX(2);
	ground->setScaleY(2);
	b2BodyDef bDef;
	bDef.type = b2_staticBody;
	bDef.position = b2Vec2(size.width/2/RATIO,size.height/2/RATIO);//设置碰撞物体的位置
	b2PolygonShape groundShape;
	groundShape.SetAsBox(size.width/2/RATIO,size.height/2/RATIO-0.3);//position 和SetAsBox 都可以改变碰撞物体的位置 不知为何
	b2Body *groundBody = world->CreateBody(&bDef);
	b2FixtureDef fix;
	fix.shape = &groundShape;
	groundBody->CreateFixture(&fix);
	groundBody->SetUserData(ground);
	addChild(ground);

linearVelocity  是设置盒子执行的动作 如 往各个方向移动


物理盒子有 三种类型 漂浮物体  静态物体 和动态物体 

漂浮物体不受重力音响 可自由移动,静态物体位置是固定的不会掉落, 动态物体会自由掉落


笔记至此结束


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值