![]() |
|
||||||||||
|
|||||
|
Регистрация: Aug 2009
Сообщений: 40
|
Недавно начал разбираться с box2d и столкнулся с проблемой.
Проблема заключается в том, что созданные фигуры проваливаются друг в друга как на картинке ниже. [IMG]http://i057.***********/1102/56/5ad83cd394a6.png[/IMG] Ни как не пойму в чём же дело. Вот исходники: package { import flash.display.MovieClip; import flash.display.Graphics; import flash.events.*; import flash.display.Shape; import flash.display.Sprite; import Box2D.Collision.*; import Box2D.Common.Math.b2Vec2; import Box2D.Dynamics.*; import Box2D.Collision.Shapes.*; public class main extends MovieClip{ var timeStep:Number = 1/60; var iterations:Number = 100; var world:b2World; var dbgDraw:b2DebugDraw; var debugSprite; var f:figure; public function main() { //Мир var worldAABB:b2AABB = new b2AABB(); worldAABB.lowerBound.Set(-100.0, -100.0); worldAABB.upperBound.Set(100.0, 100.0); var gravity:b2Vec2 = new b2Vec2 (0.0, 100.0); var doSleep:Boolean = true; world = new b2World(worldAABB, gravity, doSleep); //Фигура var figura:Shape = new Shape(); addChild(figura); figura.graphics.beginFill(0x000000, 0.50); figura.graphics.lineStyle(2, 0x000000); f = new figure(); for(var i = 0; i < 8; i++){ figura.graphics.lineTo(f.X[i], f.Y[i]); } figura.graphics.lineTo(f.X[0], f.Y[0]); figura.x = 100; figura.y = 50; figura.graphics.endFill(); var ground:Shape = new Shape(); addChild(ground); ground.graphics.beginFill(0x000000, 0.50); ground.graphics.lineStyle(1, 0x000000); ground.graphics.lineTo(200, 0); ground.graphics.lineTo(200, 100); ground.graphics.lineTo(0, 100); ground.graphics.lineTo(0, 0); ground.x = 100; ground.y = 300; ground.graphics.endFill(); debugSprite = new Sprite(); addChild(debugSprite); dbgDraw= new b2DebugDraw(); //Бокс var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set(figura.x/30, figura.y/30); bodyDef.userData = figura; var body:b2Body = world.CreateBody(bodyDef); var shapeDef:b2PolygonDef = new b2PolygonDef(); shapeDef.vertexCount = 8; for(var i = 0; i < 8; i++){ shapeDef.vertices[i].Set(f.X[i]/30, f.Y[i]/30); } shapeDef.density = 0.00000001; shapeDef.friction = 0.3; shapeDef.restitution = 0.3; body.CreateShape(shapeDef); body.SetMassFromShapes(); //Земля var bodyDef:b2BodyDef = new b2BodyDef(); bodyDef.position.Set(ground.x/30, ground.y/30); bodyDef.userData = ground; var body:b2Body = world.CreateBody(bodyDef); var shapeDef:b2PolygonDef = new b2PolygonDef(); shapeDef.vertexCount = 4; shapeDef.vertices[0].Set(200/30, 0); shapeDef.vertices[1].Set(200/30, 100/30); shapeDef.vertices[2].Set(0, 100/30); shapeDef.vertices[3].Set(0, 0); shapeDef.density = 0; shapeDef.friction = 1; shapeDef.restitution =0.2; body.CreateShape(shapeDef); body.SetMassFromShapes(); addEventListener(Event.ENTER_FRAME, updateWorld); } public function updateWorld(e:Event){ world.Step(timeStep, iterations); dbgDraw.m_sprite = debugSprite; dbgDraw.m_drawScale = 30.0; dbgDraw.m_fillAlpha = 0.3; dbgDraw.m_lineThickness = 1.0; dbgDraw.m_drawFlags = b2DebugDraw.e_shapeBit | b2DebugDraw.e_jointBit; world.SetDebugDraw(dbgDraw); for (var bodiesList = world.GetBodyList(); bodiesList; bodiesList = bodiesList.GetNext()){ // Извлекаем вектор позиции тела var tVector = bodiesList.GetPosition(); // Присваиваем значения этого вектора, заранее умножив на коефициент перевода с метров в пиксели, нашему графическому отображению. bodiesList.m_userData.x = tVector.x * 30; bodiesList.m_userData.y = tVector.y * 30; // Извлекаем угол (в радианах) множим на коефициент перевода в градусы и присваиваем нашему отображению bodiesList.m_userData.rotation = bodiesList.GetAngle() * 180 / Math.PI; } } } } |
|
|||||
|
Регистрация: Aug 2009
Сообщений: 40
|
Т.е фигуру которая у меня на изображении я должен собрать из нескольких простых выпуклых фигур и соединить их, тогда будет нормально работать?
|
![]() |
![]() |
Часовой пояс GMT +4, время: 23:28. |
|
|
« Предыдущая тема | Следующая тема » |
|
|