Цитата:
Сообщение от bugizavr
но как его повернуть на заданный угл? весь маятник, относительно крепежа, например так:
|
При создании b2DistanceJoint вам нужно задать 2 тела и 2 точки, так:

Код AS3:
distanceJointDef.Initialize(body1,body2,point1,point2);
joint=m_world.CreateJoint(distanceJointDef);
В вашем случае одним из тел будет шар, а другим m_ground (создайте его заранее m_ground=m_world.GetGroundBody(); )
Никаких проблем с поворотом маятника здесь нет, т.к. мы просто задаем 2 этих тела и 2 точки в глобальных координатах мира.
Если ваш вопрос заключается в том чтобы создать b2DistanceJoint из спрайта (линии на экране), что намного удобнее чем вбивать координаты руками, то вот как у меня это получилось:

Код AS3:
var distanceJointDef:b2DistanceJointDef=new b2DistanceJointDef();
var length:Number=_length;
var point1:b2Vec2=new b2Vec2(clip.x/m_physScale, clip.y/m_physScale);
var point2:b2Vec2=new b2Vec2((clip.x+length*Math.cos(clip.rotation*Math.PI/180))/m_physScale,
(clip.y+length*Math.sin(clip.rotation*Math.PI/180))/m_physScale);
var body1:b2Body=GetBodyAtPoint(point1.x,point1.y);
var body2:b2Body=GetBodyAtPoint(point2.x,point2.y);
if(body1==null) body1=m_ground;
if(body2==null) body2=m_ground;
distanceJointDef.Initialize(body1,body2,point1,point2);
joint=m_world.CreateJoint(distanceJointDef);
где _length - фактическая длинна линии, а clip - это и есть спрайт линии
Здесь приходится идти на такую уловку - рисовать shape линии горизонтально, далее преобразуем её в символ clip и только потом поворачиваем в нужную позицию. Иным способом поворот линии у меня по крайней мере получить не удалось. Хотя можно использовать и более простой способ - рисовать линию всегда под "\" наклоном и использовать width и height спрайта:

Код AS3:
var point1:b2Vec2=new b2Vec2(clip.x/m_physScale, clip.y/m_physScale);
var point2:b2Vec2=new b2Vec2((clip.x+clip.width)/m_physScale, (clip.y+clip.height)/m_physScale);
Реализацию функции GetBodyAtPoint можно найти в доступном примере TestBed.
Цитата:
Сообщение от bugizavr
ещё вопрос
нить - джоинт является рисованным элементом
как обновлять её положение(на экране)? создавать для неё body?
спасиб за внимание, буду благодарен любым ответам по теме)
|
В доступном вместе с библиотекой Box2D примере TestBed в файле Test.as в закомментированном виде есть готовая функция DrawJoint. Её надо вызывать в Update следующим образом (в том же примере это также есть в комментариях):

Код AS1/AS2:
for (var jj:b2Joint = m_world.m_jointList; jj; jj = jj.m_next){
DrawJoint(jj);
}