Box2D: заставлять тела падать через случайные интервалы

0

Я пытаюсь разработать игру, в которой у меня есть несколько тел b2PolygonShape и они должны падать сверху. Но я хочу, чтобы они падали со случайных позиций и с некоторой задержкой. То, что я сделал до сих пор, не заставляет меня работать, т.е. Тела падают, но они падают вместе. Я не знаю, как горячо назвать функцию с некоторой задержкой! Я даже не могу назвать это из функции display. И функция init вызывается только один раз. Это то, что я пробовал до сих пор:

aadBrick Функции, которые на самом деле для тела, которые должны падать

b2Body* addBrick(int x,int y,int w,int h,bool dyn=true)
{
    b2BodyDef bodydef;  
    bodydef.position.Set(x*P2M,y*P2M);   //Setting body position
    if(dyn)
    {
            bodydef.type=b2_dynamicBody;  // dynamic body means body will move

    }

    brick=world->CreateBody(&bodydef);        //Creating box2D body

    b2PolygonShape shape;            //Creating shape object
    shape.SetAsBox(P2M*w,P2M*h);

    ////////////// Adding Fixtures(mass, density etc) //////////////


    brickFixture.shape=&shape;
    brickFixture.density=1.0;
    circleFixture.restitution = 0.7;
    brick->CreateFixture(&brickFixture);
    return brick;
}

Это функция init

void init()
{
    glMatrixMode(GL_PROJECTION);
    glOrtho(0,WIDTH,HEIGHT,0,-1,1);
    glMatrixMode(GL_MODELVIEW);
    glClearColor(0,0,0,1);

    world=new b2World(b2Vec2(0.0,5.8));

    addGround(WIDTH/2,HEIGHT-80,WIDTH,10,false); 

    addBrick(80,0,10,10);// these bricks should fall with some delay not together
    addBrick(100,0,10,10);

    actor=addActor(80,460,50,70,false); // static body

}

И это функция таймера, если есть что-то делать с задержкой!

void Timer(int t)
{
world->Step(1.0/30.0,8,3);

glutPostRedisplay();
glutTimerFunc(1000/30,Timer,1);
}
  • 0
    Вы делаете два addBrick одновременно. Вам просто нужно подождать, прежде чем делать второй.
  • 0
    Как установить эту вещь "ждать" ?? Вот что я спрашиваю
Показать ещё 1 комментарий
Теги:
timer
opengl
2d
box2d

1 ответ

2
Лучший ответ

Я предлагаю следующее решение:

    int mCounter = 0;

    #define MAX_DELAY 60

    void Timer(int t)
    {
        if (mCounter <= 0)
        {
            // rand() % 100 - random value in range 0 - 99
            addBrick(rand() % 100, 0,10,10);

            mCounter = rand() % MAX_DELAY;
        }
        mCounter -= t;

        world->Step(1.0/30.0,8,3);

        glutPostRedisplay();
        glutTimerFunc(1000/30,Timer,1);
    }
  • 0
    Здорово! Спасибо, ты сделал мой день !!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню