Как вы изменяете края наземного приспособления в наземном теле box2d

Во время игры игры я хотел бы иметь возможность изменить наземные края в мире Box2D. Я создал наземное тело, и затем я добавляю наземное приспособление к телу. Например, следующий код создаст плоскую землю на 20 пикселей выше нижней части экрана в моем мире Box2D:

b2BodyDef groundBodyDef;
groundBodyDef.type = b2_staticBody;
groundBodyDef.position.Set(0, 0);
groundBody = world->CreateBody(&groundBodyDef);

b2PolygonShape groundShape;
b2FixtureDef groundFixtureDef;
groundFixtureDef.shape = &groundShape;
groundFixtureDef.density = 0.0;

CGSize screenSize = [CCDirector sharedDirector].winSize;
int num = 2;
b2Vec2 verts[] = {
    b2Vec2(-screenSize.width/100.0, 20.0/100.0),   
    b2Vec2(screenSize.width/100.0, 20.0/100.0)
};

for(int i = 0; i < num - 1; ++i) {
    b2Vec2 offset = b2Vec2(screenSize.width/2/PTM_RATIO,
                           20.0/2/PTM_RATIO);
    b2Vec2 left = verts[i] + offset;
    b2Vec2 right = verts[i+1] + offset;

    groundShape.SetAsEdge(left, right);
    groundBody->CreateFixture(&groundFixtureDef);
}

Предположим, что я должен изменить множество verts, чтобы иметь различное наземное определение приспособления? Например, действительно ли возможно динамично поднять землю на 50 пикселей между шагами игрока? Я должен удалить все наземное тело и воссоздать наземное тело и приспособление, или я могу просто удалить или изменить существующее наземное приспособление?

2
nl ja de

2 ответы

Я нашел, что это работало, чтобы разрушить ток groundBody сопровождаемый созданием нового groundBody, и наземное приспособление хорошо работает. Я не знаю, является ли это лучшим для работы, но она работает как, я хотел ее к.

Так в основном, в подходящее время во время моей игры, я делаю следующее:

    world->DestroyBody(groundBody);

Тогда я повторно выполняю код, который я показал в проблемном заявлении выше, заменив 20.0 пиксельными значениями с 50.0 пиксельными значениями во множестве verts следующим образом:

b2Vec2 verts[] = {
    b2Vec2(-screenSize.width/100.0, 50.0/100.0),   
    b2Vec2(screenSize.width/100.0, 50.0/100.0)
}
1
добавлено

Измените b2PolygonShape на b2EdgeShape.

CGSize s = [[CCDirector sharedDirector] winSize];
b2EdgeShape groundBox;

// bottom
groundBox.Set(b2Vec2(0.0f,0.0f), b2Vec2(s.width/PTM_RATIO,0.0f));
groundBody->CreateFixture(&groundBox,0);

Вы не можете изменить определение приспособления во времени выполнения. Так используйте различное приспособление и выключатель то тело во время выполнения.

0
добавлено
Вы предлагаете, чтобы я создал 2 различных наземных тела (каждый с их собственным приспособлением) и переключил тело во времени выполнения? Если так, как вы выполняете выключатель?
добавлено автор JeffB6688, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.