Показать сообщение отдельно
Старый 20.11.2011, 22:51
Silencе вне форума Посмотреть профиль Отправить личное сообщение для Silencе Найти все сообщения от Silencе
  № 15  
Ответить с цитированием
Silencе

Регистрация: Aug 2011
Сообщений: 53
если динамическое тело - мяч. и статическое тело, состоящее из двух шейпов в одном Боди.
при столкновение тел мое тело (динамическое) пролетает сквозь статическое тело. при этом динамическое тело тратит свою энергию на совершение работы по преодолению сопротивления статического тела.

Код AS1/AS2:
 
 
// Статическое тело:
            var bodyDef_:b2BodyDef;
            var polygonShape_:b2PolygonShape;
            var fixtureDef_:b2FixtureDef;
 
            var bodyLine_:b2Body;
            var wallStageThickness_:Number = 3;
            var ballDiameter_:Number = 20;
 
            // init
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set((_mapBase.stage.stageWidth - (wallStageThickness_ + ballDiameter_ + 10)) / METERS, _mapBase.stage.stageHeight / METERS);
            bodyDef_.type = b2Body.b2_staticBody;
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            polygonShape_ = new b2PolygonShape();
            fixtureDef_ = new b2FixtureDef();
 
             //первый шейп
            polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
 
             //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
если в коде приведенном выше изменить ширину первого шейпа:

Код AS1/AS2:
polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
вот так вот:
Код AS3:
 polygonShape_.SetAsBox(wallStageThickness_ / METERS, 450 / METERS);
        // убрали "-" перед 450
то при сталкивание с этой частью моего статического тела, мяч упруго отскакивает.

ладно с этим разобрался.
но в этом же теле существует другой шейп:


Код AS1/AS2:
      //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
мяч сквозь него пролетает, а надо чтобы отскакивал.

Добавлено через 1 час 25 минут
ответ:
для каждой фигуры(именно фигура, не путать с Телом = тело может состоять из нескольких фигур) нужно создавать отдельный bodyDef_ и переназначь позицию:

Код AS1/AS2:
      //Статическое тело
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set((_mapBase.stage.stageWidth - (wallStageThickness_ + ballDiameter_ + 10)) / METERS, _mapBase.stage.stageHeight / METERS);
            bodyDef_.type = b2Body.b2_staticBody;
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            polygonShape_ = new b2PolygonShape();
            fixtureDef_ = new b2FixtureDef();
 
            // Первый шейп
            polygonShape_.SetAsBox(wallStageThickness_ / METERS, 450 / METERS);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
 
            // Второй шейп
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set(375 / METERS, 90 / METERS);
            polygonShape_ = new b2PolygonShape();
            polygonShape_.SetAsEdge(b2Vec2.Make(5/METERS, 0/METERS), b2Vec2.Make(-20/METERS, -20/METERS));
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            fixtureDef_.userData = "left";
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
Добавлено через 5 часов 25 минут
[quote=Silencе;1047248]если динамическое тело - мяч. и статическое тело, состоящее из двух шейпов в одном Боди.
при столкновение тел мое тело (динамическое) пролетает сквозь статическое тело. при этом динамическое тело тратит свою энергию на совершение работы по преодолению сопротивления статического тела.

Код AS1/AS2:
 
 
// Статическое тело:
            var bodyDef_:b2BodyDef;
            var polygonShape_:b2PolygonShape;
            var fixtureDef_:b2FixtureDef;
 
            var bodyLine_:b2Body;
            var wallStageThickness_:Number = 3;
            var ballDiameter_:Number = 20;
 
            // init
            bodyDef_ = new b2BodyDef();
            bodyDef_.position.Set((_mapBase.stage.stageWidth - (wallStageThickness_ + ballDiameter_ + 10)) / METERS, _mapBase.stage.stageHeight / METERS);
            bodyDef_.type = b2Body.b2_staticBody;
            bodyLine_ = _mapBase.world.CreateBody(bodyDef_);
            polygonShape_ = new b2PolygonShape();
            fixtureDef_ = new b2FixtureDef();
 
             //первый шейп
            polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
 
             //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
если в коде приведенном выше изменить ширину первого шейпа:

Код AS1/AS2:
polygonShape_.SetAsBox(wallStageThickness_ / METERS, -450 / METERS);
вот так вот:
Код AS3:
 polygonShape_.SetAsBox(wallStageThickness_ / METERS, 450 / METERS);
        // убрали "-" перед 450
то при сталкивание с этой частью моего статического тела, мяч упруго отскакивает.

ладно с этим разобрался.
но в этом же теле существует другой шейп:


Код AS1/AS2:
      //второй шейп
             polygonShape_.SetAsArray([bodyLine_.GetLocalPoint(b2Vec2.Make(375 / METERS, 90 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(364 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(367 / METERS, 56 / METERS)), bodyLine_.GetLocalPoint(b2Vec2.Make(378 / METERS, 90 / METERS))]);
            fixtureDef_.shape = polygonShape_;
            bodyLine_.CreateFixture(fixtureDef_);
мяч сквозь него пролетает, а надо чтобы отскакивал.

Добавлено через 1 час 25 минут
/*неверно*/

Добавлено через 5 часов 37 минут
Код AS1/AS2:
 var body:b2Body; //тело
            var bodyDef:b2BodyDef; //геометрические настройки тела
            var bodyShapePoligon:b2PolygonShape;
            var wallThickness:Number = 5; //толщина стены в пикселях
            var fixDef:b2FixtureDef = new b2FixtureDef();
 
            //right
            bodyDef = new b2BodyDef(); //создаем b2BodyDef
            bodyDef.position.Set(156 / METERS, 108 / METERS);
            bodyShapePoligon = new b2PolygonShape();
            bodyShapePoligon.SetAsArray([b2Vec2.Make(0 / METERS, 0 / METERS), b2Vec2.Make(-13 / METERS, 11 / METERS), b2Vec2.Make(-20 / METERS, 47 / METERS)]);
            body = _mapBase.world.CreateBody(bodyDef);//создаем тело
            fixDef.userData = "right";
            fixDef.shape = bodyShapePoligon;
            body.CreateFixture(fixDef);
этот код представляет треугольник. почему при таких настройках мой динамический объект сквозь него пролетает?

Добавлено через 5 часов 48 минут
в коде выше изменяем метод SetAssArray
Код AS3:
bodyShapePoligon.SetAsArray([b2Vec2.Make(10 / METERS, -10 / METERS), b2Vec2.Make(-10 / METERS, -10 / METERS), b2Vec2.Make(0 / METERS, -37 / METERS)]);
все нормально. мяч не пролетает сквозь треугольник.

а теперь повернем треугольник на 90 градусов:
Код AS3:
bodyShapePoligon.SetAsArray([b2Vec2.Make(-10 / METERS, -10 / METERS), b2Vec2.Make(-10 / METERS, 10 / METERS), b2Vec2.Make(37 / METERS, 0 / METERS)]);
мяч вновь пролетает! wtf?!


Последний раз редактировалось Silencе; 21.11.2011 в 04:26.