Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > API приложений и сред

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 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;
                 	}
		}
	}
 
}

Старый 13.02.2011, 23:00
Alex Lexcuk вне форума Посмотреть профиль Отправить личное сообщение для Alex Lexcuk Посетить домашнюю страницу Alex Lexcuk Найти все сообщения от Alex Lexcuk
  № 2  
Alex Lexcuk

блогер
Регистрация: Mar 2008
Адрес: Донецк_city
Сообщений: 1,094
Записей в блоге: 5
Фигуры должны быть выпуклые.
__________________
Гоночка

Старый 13.02.2011, 23:08
Elidan вне форума Посмотреть профиль Отправить личное сообщение для Elidan Найти все сообщения от Elidan
  № 3  
Elidan

Регистрация: Aug 2009
Сообщений: 40
Т.е фигуру которая у меня на изображении я должен собрать из нескольких простых выпуклых фигур и соединить их, тогда будет нормально работать?

Старый 13.02.2011, 23:09
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Верно.
__________________
тут я

Старый 14.02.2011, 12:11
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 5  
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Название темы не раскрывает сути вопроса.
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Создать новую тему Закрытая тема Часовой пояс GMT +4, время: 23:28.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 23:28.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.