PDA

Просмотр полной версии : [Box2D] MultiShape


AlexCooper
09.06.2011, 03:27
Здравствуйте.
Контуры движок вырисовывает а считать объект физически не хочет, то-есть не срабатывают касания.
Используемые функции
public function CreateMultiShape(PointArray:Array):b2PolygonShape
{
for( var cord in PointArray) PointArray[cord] = new b2Vec2(PointArray[cord].x/pixels_in_a_meter,PointArray[cord].y/pixels_in_a_meter);

var tempShape:b2PolygonShape = new b2PolygonShape();

tempShape.SetAsArray(PointArray,PointArray.length);

return tempShape;
}
public function CreateFix(Shapes, density:Number, brake:Number=0, returnedForce:Number=0):b2FixtureDef
{
var tempFix:b2FixtureDef = new b2FixtureDef();
tempFix.shape = Shapes;
tempFix.density = density;
tempFix.friction = brake;
tempFix.restitution = returnedForce;

return tempFix;
}
public function CreateBody( FIX, posX:Number,posY:Number, ang:Number=0, fixRotation:Boolean = false, type:uint=1 ):b2Body
{
var tempBodyDef:b2BodyDef = new b2BodyDef();
var tempBody:b2Body;
tempBodyDef.type = (type) ? b2Body.b2_dynamicBody: b2Body.b2_staticBody;
tempBodyDef.fixedRotation = fixRotation;
tempBodyDef.position.Set(posX/pixels_in_a_meter, posY/pixels_in_a_meter);
tempBodyDef.angle = ang;
tempBody = m_world.CreateBody(tempBodyDef);
tempBody.CreateFixture(FIX);

return tempBody;
}

Само объявление объекта
var multi:Array = new Array();
multi.push(new b2Vec2(-100,0));
multi.push(new b2Vec2(-100,-20));
multi.push(new b2Vec2(-120,-20));
multi.push(new b2Vec2(-120,20));
multi.push(new b2Vec2(120,20));
multi.push(new b2Vec2(120,-20));
multi.push(new b2Vec2(100,-20));
multi.push(new b2Vec2(100,0));

var sL2:b2PolygonShape = CreateMultiShape(multi);
var fL:b2FixtureDef = CreateFix( sL2, 1);
var ves:b2Body = CreateBody(fL, 400, 360);
В результате объект то вырисовывается, но он пролетает всё что попадаются ему на пути и лишь некоторые на нём точки имею реакцию на столкновения с другими объектами. В чём проблема?
Если создавать более простой объект к примеру триугольник то всё работает нормально
var multi:Array = new Array();
multi.push(new b2Vec2(-100,0));
multi.push(new b2Vec2(-100,100));
multi.push(new b2Vec2(0,100));

var sL2:b2PolygonShape = CreateMultiShape(multi);
var fL:b2FixtureDef = CreateFix( sL2, 1);
var ves:b2Body = CreateBody(fL, 400, 360);

Alex Lexcuk
09.06.2011, 10:39
Может не работать от того что фигура получилась не выпуклая или узлы закручены не в ту сторону.

FieryWall
09.06.2011, 11:34
Действительно, углы вогнутые =)
И да, против часовой нельзя, у вас против часовой.
Что бы создать фигуру подобно вашей - необходимо создавать 3 прямоугольных объекта и скреплять их b2RevoluteJoint, userData цеплять к одному из них, но лучше к самому большому.

AlexCooper
09.06.2011, 14:36
Спасибо. Незнал на счёт вогнутости, но сам обошёл это переписав
public function CreateBody( FIX, posX:Number,posY:Number, ang:Number=0, fixRotation:Boolean = false, type:uint=1 ):b2Body
{
var tempBodyDef:b2BodyDef = new b2BodyDef();
var tempBody:b2Body;
tempBodyDef.type = (type==0) ? b2Body.b2_staticBody : (type==1) ? b2Body.b2_dynamicBody : b2Body.b2_kinematicBody;
tempBodyDef.fixedRotation = fixRotation;
tempBodyDef.position.Set(posX/pixels_in_a_meter, posY/pixels_in_a_meter);
tempBodyDef.angle = ang;
tempBody = m_world.CreateBody(tempBodyDef);

if (FIX=="[object b2FixtureDef]")
tempBody.CreateFixture(FIX);
else
for (var fixData in FIX) tempBody.CreateFixture2(FIX[fixData][0],FIX[fixData][1]);

return tempBody;
} и в теле объявления указал
var sC:b2CircleShape = CreateCircleShape(20, new b2Vec2(0,20));
var sBL:b2PolygonShape = CreatePolygonShape(5,20,new b2Vec2(-145,-10));
var sBR:b2PolygonShape = CreatePolygonShape(5,5,new b2Vec2(145,-10));
var sBC:b2PolygonShape = CreatePolygonShape(150,5,new b2Vec2(0,0));

var ShaDat:Array = new Array();
ShaDat.push([sC,2]);
ShaDat.push([sBL,2]);
ShaDat.push([sBR,2]);
ShaDat.push([sBC,2]);

var Swing:b2Body = CreateBody(ShaDat, 400, 400, 0);