Рисование пользовательских полигонов в Box2D - PullRequest
2 голосов
/ 14 апреля 2011

Я делаю Flash-игру и столкнулся с действительно странной проблемой при попытке нарисовать многоугольную форму в Box2D.

Вот код, который я использую:

var fixtureDefs:Array = new Array();

...

var fDef:b2FixtureDef = new b2FixtureDef();
fDef.density = 0;
fDef.shape = new b2PolygonShape();
b2PolygonShape(fDef.shape).SetAsArray(vertexArray);
fixtureDefs.push(fDef);

//This gets repeated several times, so that at the end you get a body consisting of several convex shapes.

...

var bD:b2BodyDef = new b2BodyDef();
bD.type = b2Body.b2_staticBody;
bD.position.Set(300/Constants.RATIO,200/Constants.RATIO);

var body:b2Body = Constants.world.CreateBody(bD);

...

for each(var fD:b2FixtureDef in fixtureDefs) {
body.CreateFixture(fD);
}

Где vertexArray - допустимый массив, содержащий 4 вершины b2Vec2, образующие выпуклую форму.

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

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

Еще одна странная вещь: когда я пытаюсь использовать тот же код, выбираю только SetAsBox вместо SetAsArray, он работает точно так, как и должен.

Я использую пользовательский класс ContactListener, но я не проводил никакой фильтрации контактов (если это невозможно сделать без реализации).

Я использую версию Box2D 2.1a для Flash 9 *. 1018 *

Есть предложения? Я что-то упускаю из виду или я (не дай Бог!) Обнаружил ошибку? Спасибо за вашу помощь!

Андрей

Ответы [ 2 ]

3 голосов
/ 15 апреля 2011

Heyo Andrey,

2.1a более строгая сторона, поэтому вы должны объявить почти все, чтобы она работала правильно.

AS3 OOP-

private var body:b2Body;
private var bodyDef:b2BodyDef = new b2BodyDef();
private var bodyPoly:b2PolygonShape = new b2PolygonShape();
private var bodyFix:b2FixtureDef = new b2FixtureDef();

private var vertexArray:Array = new Array();

public function Example() 
{

//Setting up Vertices in an Array   
var ver1:b2Vec2 = new b2Vec2( -1, -1);
var ver2:b2Vec2 = new b2Vec2( 1, -1);
var ver3:b2Vec2 = new b2Vec2( 1, 1);
var ver4:b2Vec2 = new b2Vec2( -1, 1);

//Push in order
vertexArray.push(ver1, ver2, ver3, ver4);

bodyDef.type = b2Body.b2_dynamicBody;
//b2Vec2 Array then Vertex Count
bodyPoly.SetAsArray(vertexArray, vertexArray.length);
bodyFix.shape = bodyPoly;
bodyFix.density = 0.5;
bodyFix.friction = 0.5;
bodyFix.restitution = 0.5;
bodyDef.position.Set(0, 0);
body = m_world.CreateBody(bodyDef);
body.CreateFixture(bodyFix);

}

Помните, что каждая точка должна быть справа от предыдущей.

var ver1:b2Vec2 = new b2Vec2( -1, -1);//Top Left
var ver2:b2Vec2 = new b2Vec2( 1, -1);//Top Right
var ver3:b2Vec2 = new b2Vec2( 1, 1);//Bottom Right
var ver4:b2Vec2 = new b2Vec2( -1, 1);//Bottom Left

Расположение слева направо

vertexArray.push(ver1, ver2, ver3, ver4);

Я не очень хорош в объяснении вещей, но надеюсьэто помогает!-Zero

0 голосов
/ 15 апреля 2011

Снова Heyo, так как большинство версий Box2D были написаны разными людьми, изменения источника с ним, чтобы лучше соответствовать языку программирования, документация, на которую вы смотрели, вероятно, ссылалась на другой язык, чем AS3, наиболее вероятно C ++.

Ваш источник должен иметь папку с документацией для этой версии, должна быть папка с именем 'Docs'.

...