Создание b2body для спрайта в box2d

После учебник для игры прорыва Я создал 3 спрайта со своими телами — шар и 2 весла. Мой вопрос может быть очень простым, так что извините, я все еще учусь. Во всяком случае, моя проблема в отличие от примера, мои спрайты масштабируются, т.е.

-(id)init {
p1 = [CCSprite spriteWithFile:@"1.png"];
p1.position = ccp(160, winSize.height * 0.08);
p1.scaleX = 190 / 2 / p1.contentSize.width;
p1.scaleY = 58 / 2 / p1.contentSize.height;

b2BodyDef p1BodyDef;
p1BodyDef.type = b2_dynamicBody;
p1BodyDef.position.Set(160/PTM_RATIO, 40/PTM_RATIO);
p1BodyDef.userData = p1;
_p1Body = _world->CreateBody(&p1BodyDef);

b2PolygonShape p1Shape;
p1Shape.SetAsBox(p1.contentSize.width/PTM_RATIO/2, p1.contentSize.height/PTM_RATIO/2);

b2FixtureDef p1ShapeDef;
p1ShapeDef.shape = &p1Shape;
p1ShapeDef.density = 0.3f;
p1ShapeDef.friction = 1.0f;
p1ShapeDef.restitution = 0.0f;
_p1Fixture = _p1Body->CreateFixture(&p1ShapeDef);
}

После создания тела я создал метод обновления, который обнаруживает столкновение между моим веслом и мячом, используя контактный слушатель. Это работает хорошо, однако, я заметил во время тестирования игры, что есть случаи, когда мяч отскакивает, даже если он не сталкивался с фактическим положением спрайта, например, на расстоянии 2-3 см для верхней и боковых сторон весла. Я подозреваю, что это потому, что форма моего многоугольника и шкалы-x и -y моего спрайта различны. Итак, мой вопрос, как я могу установить размер тела таким же, как масштабированный спрайт? Я попробовал что-то вроде:

p1Shape.SetAsBox(190 / 2 / p1.contentSize.width/PTM_RATIO/2, 58 / 2 / p1.contentSize.height/PTM_RATIO/2);

Но столкновение было проигнорировано, как будто тела вообще не было. Итак, как мне сделать тело b2 моего весла такого же размера, как спрайт весла, если он масштабирован?

-1

Решение

Я не уверен на 100%, но думаю, что понял это после еще нескольких исследований. Вот как я устанавливаю форму тела:

p1Shape.SetAsBox(p1.contentSize.width/PTM_RATIO/2 * p1.scaleX, p1.contentSize.height/PTM_RATIO/2 * p1.scaleY);

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

-1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector