box2d学习小资料自己总结

1debugdraw 函数的作用是做测试只用主要是对物理中的刚体状态碰撞什么的进行检测 

以便于我们编码

调用box2d中的一些数据 在利用opengles对其 显示出来的形状进行模拟

2在碰撞检测中有两种方式一个是组索引形式 另外一种是种群加掩码形式的

(如果一个进行了掩码设置那么所有的物体都要有掩码否则的画 这个物体默认的一些设定如下

  filter.categoryBits = 0x0001;    

filter.maskBits = 0xFFFF;          

filter.groupIndex = 0;        

//默认情况下的categirybits值为1 掩码是最大值 如果刚开始用的是默认值的时候意思就是所有的物体的种即categoryBits为1  

//那么就是默认情况下所有的物体都相撞,如果其他的设定了categoryBits且不是默认值,那么他的掩码默认是0xFFFF是一个很大的数字       

 //能和所有的物体相撞所以如果设置了categoryBits而没有设定mask则所有的物体仍然按组索引来进行判断组索引默认状况下是0

//maskbits和种群在情况复杂是要对两个物体都进行设置

6.3 传感器(Sensors)

有时候游戏逻辑需要判断两个fixture是否相交,但却不应该有碰撞反应。这可以通过传感器(sensor)来完成。传感器也是个fixture,但只会侦测碰撞而不产生其它反应。

你可以将任一fixture标记为传感器。传感器可以是static或dynamic的。记住,每个物体上可以有多个fixture, 传感器和实体fixture是可以混合存在的。

传感器不会生成接触点。这里有两种方法得到传感器的状态:

1. b2Contact::IsTouching

2. b2ContactListener::BeginContact 和 EndContact

userdata的使用

1.使用userdata获得box2d的物体数据

float xx=0.0;
float yy = 0.0;
float angle=0.0;
for(b2Body *b = m_world->GetBodyList(); b; b=b->GetNext())
{
if (b->GetUserData() != NULL)
  { //对userdata进行检测然后获得userdata标记体上的一些数据
xx = b->GetPosition().x;
yy = b->GetPosition().y;
  angle = -1 *57.29577951f(b->GetAngle());
NSLog(@"%f",angle);
}
}

2使用userdata获取sprite的数据

--------------userdata 通过标记点获得所连接数据的状态值

- (void)tick:(ccTime) dt {
  _world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) { //遍历全部的body
  if (b->GetUserData() != NULL) {//创建ccsprite对象 然后把那个空指针连接的数据转换成ccsprite*类型(其实本来就是 不过是void连接的)
  CCSprite *ballData = (CCSprite *)b->GetUserData();//得到ccsprite的一些状态值 然后对box2d的无力数据进行修改
  ballData.position = ccp(b->GetPosition().x * PTM_RATIO,//
b->GetPosition().y * PTM_RATIO);
ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
NSLog(@"%f",ballData.rotation);
}
}
两个方法一个是box2d为主体然后获得box2d物体的数据然后传递值给图片或者是ccsprite进行同步

另外一种方法是 对图片进行操作 然后传递图片的一些数据给box2d然后进行数据的同步再绘图
}

在这里获取的是body的position状态值 然后根据值来对纹理图片的为止和旋转角度进行修改

box2d的世界可以和opengles在一个面渲染 然后刷新频率可以相同然后在进行同步更新

函数 参数的传递[jice drawAtPoint:CGPointMake(xx, yy) t:angle];

texture2d中drawatpoint函数的修改部分

- (void) drawAtPoint:(CGPoint)point t:(float)angle
{
GLfloat coordinates[] = {
0, _maxT,
_maxS, _maxT,
0, 0,
_maxS, 0
};
GLfloat width = (GLfloat)_width * _maxS,
height = (GLfloat)_height * _maxT;
GLfloat vertices[] = {
-width / 2 , -height / 2 , 0.0,
width / 2, -height / 2, 0.0,
-width / 2, height / 2, 0.0,
width / 2, height / 2, 0.0 };

glTranslatef(point.x, point.y, 0.0);
glRotatef(-angle, 0.0, 0.0, 1.0);
glBindTexture(GL_TEXTURE_2D, _name);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
}

如果原方法只是传递xx,yy而不对代码进行修改的话,旋转部分是不正确的因为旋转是以opengles的原点为中心点进行的

而不修改的话,图片会话到xx,yy然后以原点进行旋转所以图片的为止和box2d的为止无法完全重合


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值