zoukankan      html  css  js  c++  java
  • box2d之刚体,定制器笔记

    刚体(Body):
    通过世界创建的对象,物理引擎里面所有东西都是刚体
    创建方式:
    定义一个b2BodyDef,b2World调用createBody的方法传入此参数

    定制器(Fixture):
    带有形状,密度,摩擦力等属性
    创建方式:
    定义一个b2FixtureDef,调用刚体的createFixture方法为刚体创建定制器(相当于附加属性),每个刚体支持添加多个Fixture;
    刚体的createFixture重载了两种模式,一种是b2FixtureDef作为参数,一种是shape作为参数,效果是一样的。

    形状(shape):
    刚体的形状
    种类:
    circle(圆形),Polygon(多边形),其他等等

    基本上他们的范围是这样:world,body,fixture(刚体的多个属性)


    tips:b2Vec2是2dx里面类似CGPoint的东西

    具体看代码

     1     //刚体
     2     b2BodyDef testBodyDef;
     3     testBodyDef.type = b2_staticBody;
     4     testBodyDef.position.Set(0,0);
     5     
     6     //底部的边缘线
     7     b2EdgeShape testShape;
     8     testShape.Set(b2Vec2(0,0), b2Vec2(s.width/PTM_RATIO,0));
     9     
    10     b2FixtureDef testFixtueDef;
    11     testFixtueDef.shape = &testShape;
    12 
    13     b2Body* testBody = world->CreateBody(&testBodyDef);
    14     testBody->CreateFixture(&testFixtueDef);
    15     
    16     //顶部边缘线
    17     testShape.Set(b2Vec2(0,s.height/PTM_RATIO), b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));
    18     testBody->CreateFixture(&testFixtueDef);
    19     
    20     //左边边缘线
    21     testShape.Set(b2Vec2(0,0), b2Vec2(0,s.height/PTM_RATIO));
    22     testBody->CreateFixture(&testFixtueDef);
    23     
    24     //右边边缘线
    25     testShape.Set(b2Vec2(s.width/PTM_RATIO,0), b2Vec2(s.width/PTM_RATIO,s.height/PTM_RATIO));
    26     testBody->CreateFixture(&testFixtueDef);
    27 
    28     //创建可运动的缸体
    29     CCPoint ballPosition = CCPointMake(200, 100);
    30     CCSprite* ballSprite = CCSprite::create("Ball.png");
    31     ballSprite->setPosition(ballPosition);
    32     this->addChild(ballSprite);
    33     
    34     b2BodyDef moveableBodyDef;
    35     moveableBodyDef.type = b2_dynamicBody;
    36     
    37     //设置刚体位置
    38     //刚体相对于世界的位置,坐标转换为box2d里面的坐标
    39     moveableBodyDef.position.Set(ballPosition.x/PTM_RATIO,ballPosition.y/PTM_RATIO);
    40     //把精灵放到b2BodyDef的userData里面,在update里面刷新精灵位置
    41     moveableBodyDef.userData = ballSprite;
    42     
    43     b2Body *moveableBody = world->CreateBody(&moveableBodyDef);
    44     
    45     //创建圆形小球
    46     b2CircleShape testCircleShape;
    47     //刚体和形状设置坐标的时候,选一个就ok
    48     testCircleShape.m_p.Set(0,0);
    49     float radius = ballSprite->getContentSize().width/(2*PTM_RATIO);
    50     testCircleShape.m_radius = radius;
    51     
    52     b2FixtureDef moveableFixtureDef;
    53     moveableFixtureDef.shape = &testCircleShape;
    54     moveableFixtureDef.density = 1.0f;
    55     moveableFixtureDef.friction = 0.3f;
    56     moveableBody->CreateFixture(&moveableFixtureDef);

    update方法

     1 void HelloWorld::update(float dt)
     2 {
     3     int velocityIterations = 8;
     4     int positionIterations = 1;
     5     
     6     world->Step(dt, velocityIterations, positionIterations);
     7     
     8     //刷新精灵位置
     9     for (b2Body* body = world->GetBodyList(); NULL!= body; body = body->GetNext())
    10     {
    11         if ( NULL != body->GetUserData() )
    12         {
    13             CCSprite* sprite = (CCSprite*)body->GetUserData();
    14             
    15             sprite->setPosition( CCPointMake( body->GetPosition().x * PTM_RATIO, body->GetPosition().y * PTM_RATIO) );
    16             sprite->setRotation( -1 * CC_RADIANS_TO_DEGREES(body->GetAngle()) );
    17         }    
    18     }
    19 }
  • 相关阅读:
    TFS二次开发-基线文件管理器(5)-源码文件的读取
    TFS二次开发-基线文件管理器(4)-标签的创建
    TFS二次开发-基线文件管理器(3)-源码文件的读取
    TFS二次开发-基线文件管理器(2)-TFS登录
    TFS二次开发-基线文件管理器(1)-设计
    学习实践:使用模式,原则实现一个C++自动化测试程序
    学习实践:使用模式,原则实现一个C++数据库访问类
    C++字符转换等常用方法
    sqlserver 创建 aspstate的方法
    双网卡只有一个能ping通的解决办法
  • 原文地址:https://www.cnblogs.com/ziyouchutuwenwu/p/3132522.html
Copyright © 2011-2022 走看看