Cocos2d Box2d Масштабирование тел радиуса окружности

В настоящее время в cocos2d у меня есть приложение, которое делает следующее:

Начните с пустого экрана. Когда я нажимаю на экран, у меня появляется кружок. Пока я держу круг, круг будет продолжать расти с постоянной скоростью. Однако, несмотря на то, что спрайт растет, физическое тело box2d — нет, а значит, спрайт не будет сталкиваться с другими телами. Я пытался найти способ изменить радиус, который масштабируется вместе со спрайтом, но для cocos2d такого вопроса не существует. Я заметил другие box2d для вещей, отличных от cocos2d, но мне трудно их перевести.

//smile.position = ccp(touchLocation.x, touchLocation.y);
smile.scale = .05;
[self addChild:smile];


// b2BodyDef smileBodyDef;

smileBodyDef.type = b2_dynamicBody;
smileBodyDef.position.Set(touchLocation.x/PTM_RATIO, touchLocation.y/PTM_RATIO);
smileBodyDef.userData = smile;
smileBody = world->CreateBody(&smileBodyDef);
//Radius
b2CircleShape smileCircleShape;
int radius = 80;

//Fixture
smileFixtureDef.shape = &smileCircleShape;
smileFixtureDef.density = 0.00f;
smileFixtureDef.friction = .2f;
smileBody->CreateFixture(&smileFixtureDef);




if (CGRectContainsPoint(smileRect, touchLocation)) {
growForever = [CCRepeatForever actionWithAction: [CCScaleBy actionWithDuration: .5 scale:    1.2]];
[growForever setTag:1];
[smile runAction:growForever];

person Wei Pan    schedule 29.10.2012    source источник


Ответы (1)


Каждый раз, когда вы хотите изменить свой радиус, захватывайте объект формы, связанный с b2Fixture, который вы создали для своего тела, а затем соответствующим образом устанавливайте новое значение:

fixture->GetShape()->m_radius = new_radius/PTM_RATIO;
person Ken Toh    schedule 30.10.2012
comment
Вы можете это объяснить? Я попытался скопировать и вставить это, но он говорит мне, что new_radius является неопознанной переменной. - person Wei Pan; 05.11.2012
comment
new_radius — это просто новое значение радиуса вашего спрайта улыбки. По мере масштабирования спрайта улыбки вы хотите, чтобы радиус формы также соответствовал масштабируемому размеру спрайта. Вероятно, вы можете получить значение new_radius следующим образом: [smileboundingBox].size.width * 0,5, если ваш спрайт улыбки представляет собой идеальный круг. - person Ken Toh; 05.11.2012
comment
Я читал что-то о том, что тела в Box2d не масштабируются. Вам нужно уничтожить тела и повторно применить новые тела... можете поподробнее об этом? - person Wei Pan; 11.11.2012
comment
Один из способов, как упоминалось в моем ответе, - просто изменить существующее крепление тела. Чтобы обеспечить соответствующую настройку массовых характеристик, вы можете выполнить: body-›ResetMassData(); В качестве альтернативы более чистым способом было бы уничтожить приспособление и воссоздать новое с большим размером и переназначить его обратно на тело. - person Ken Toh; 13.11.2012