Тема: [Box2D] Проблема с box2d
Показать сообщение отдельно
Старый 13.02.2011, 22:35
Elidan вне форума Посмотреть профиль Отправить личное сообщение для Elidan Найти все сообщения от Elidan
  № 1  
Elidan

Регистрация: Aug 2009
Сообщений: 40
Question Проблема с box2d

Недавно начал разбираться с box2d и столкнулся с проблемой.
Проблема заключается в том, что созданные фигуры проваливаются друг в друга как на картинке ниже.

[IMG]http://i057.***********/1102/56/5ad83cd394a6.png[/IMG]

Ни как не пойму в чём же дело.
Вот исходники:
Код AS3:
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;
                 	}
		}
	}
 
}