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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.08.2013, 17:13
Fazer вне форума Посмотреть профиль Отправить личное сообщение для Fazer Найти все сообщения от Fazer
  № 1  
Ответить с цитированием
Fazer
 
Аватар для Fazer

Регистрация: Aug 2012
Сообщений: 38
По умолчанию Удаление соединений кликом мыши в Box2d

Здравствуйте. Пытаюсь удалить соединение из цепочки тел, соединённых revoluteJoint, чтобы при нажатии на кнопку мыши, ближайшее из соединений удалялось (как верёвочка, которую разрезали), но ссылка ведь на соединения в Box2d не сохранятся. Как можно это реализовать? Код такой:

Код AS3:
public class TestLevel extends Sprite
{
private static var mousePVec:b2Vec2 = new b2Vec2();
private static var d_Joint:b2RevoluteJointDef; //вспомогательная переменная (соединение тела)
 
public function TestLevel():void {
stage.addEventListener(MouseEvent.MOUSE_DOWN, flagCheck); //листенер на нажатие кнопки мыши
stage.addEventListener(MouseEvent.MOUSE_UP, flagCheck); //листенер на отпускание кнопки мыши
boxTablet (); //создаёт дощечку на верёвке   
}
 
private function revoluteJoint(bodyA:b2Body, bodyB:b2Body, anchorA:b2Vec2, anchorB:b2Vec2):void {
d_Joint = new b2RevoluteJointDef();
d_Joint.localAnchorA.Set(anchorA.x, anchorA.y);
d_Joint.localAnchorB.Set(anchorB.x, anchorB.y);
d_Joint.bodyA = bodyA;
d_Joint.bodyB = bodyB;
Box2DHelpers.world.CreateJoint(d_Joint);
}
 
private function GetBodyAtMouse(includeStatic:Boolean = false):b2Body {//определяет тело находящееся под курсором мыши
   mousePVec.Set(Box2DHelpers.mouseXWorldPhys, Box2DHelpers.mouseYWorldPhys);//записываем текущие координаты курсора
   var aabb:b2AABB = new b2AABB();//создаем прямоугольную область
   aabb.lowerBound.Set(Box2DHelpers.mouseXWorldPhys - 0.001, Box2DHelpers.mouseYWorldPhys - 0.001); //вокруг курсора мыши
   aabb.upperBound.Set(Box2DHelpers.mouseXWorldPhys + 0.001, Box2DHelpers.mouseYWorldPhys + 0.001);
   var body:b2Body = null;
   var fixture:b2Fixture;
 
   function GetBodyCallback(fixture:b2Fixture):Boolean{
    var shape:b2Shape = fixture.GetShape(); //получаем шейп который находится под курсором
	var joint:b2JointEdge = body.GetJointList();
    if (fixture.GetBody().GetType() != b2Body.b2_staticBody || includeStatic){ //если тело не статическое
     var inside:Boolean = shape.TestPoint(fixture.GetBody().GetTransform(), mousePVec); //проверяем находится ли точка-позиция курсора в рамках тела
     if (inside){ //если да
      body = fixture.GetBody(); //получаем ссылку на тело
	  joint = body.GetJointList();  
      return false;
     }
    }
    return true;
   }
   world.QueryAABB(GetBodyCallback, aabb); //проверяем на попадание любых тел в область aabb
   return body; //возвращаем тело
  }
 
//создаёт дощечку на верёвке                                                                      
		private function boxTablet ():void 
		{
			// число звеньев, из которых состоит цепь
			var links:Number = 2;
			// в зависимости от полученного числа звеньев, я рассчитываю длину одного звена
			var chainLength:Number = 10 / links;
 
			var _link:b2Body; //тело звена цепи
			var _linkDef:b2BodyDef= new b2BodyDef; //геометрические параметры звена цепи
			var _linkShapePoligon:b2PolygonShape= new b2PolygonShape; //шейп звена цепи
			var _linkFixture:b2FixtureDef= new b2FixtureDef; //физические параметры звена цепи
 
			var _circle:b2Body; //тело круга
			var _circleDef:b2BodyDef= new b2BodyDef; //геометрические параметры круга
			var _circleShapeCircle:b2CircleShape = new b2CircleShape; //шейп круга
			var _circleFixture:b2FixtureDef = new b2FixtureDef(); //физические параметры круга
 
			// шейп круга
			_circleShapeCircle = new b2CircleShape(5 / Box2DHelpers.meters); //создаём круг с радиусом rad
			_circleDef = new b2BodyDef(); //создаем геометрические параметры тела
			_circleDef.position.Set(820 / Box2DHelpers.meters, 250 / Box2DHelpers.meters); //определяем начальные позиции тела
			// крепление круга
			_circleFixture.density = 1;
			_circleFixture.friction = 1;
			_circleFixture.restitution = 0.5;
			_circleFixture.shape = _circleShapeCircle; //записываем ссылку на шейп. ОБЯЗАТЕЛЬНО
			_circleDef.type = b2Body.b2_staticBody;
			// создание круга
			_circle = Box2DHelpers.world.CreateBody(_circleDef); //ссылка на мир
			_circle.CreateFixture(_circleFixture); //крепим к телу объект
 
			// шейп звена цепи
			_linkShapePoligon.SetAsBox(1 / Box2DHelpers.meters, chainLength / Box2DHelpers.meters);
			// крепление звена цепи
			_linkFixture.density = 1;
			_linkFixture.shape = _linkShapePoligon;
			// тело звена цепи
			_linkDef.type = b2Body.b2_dynamicBody;
			// создание звена цепи
			for (var i:Number = 0; i <= links; i++) {
				_linkDef.position.Set(790 / Box2DHelpers.meters, (chainLength + 2 * chainLength * i) / Box2DHelpers.meters);
				if (i == 0) {
					_link = Box2DHelpers.world.CreateBody(_linkDef); //ссылка на мир
					_link.CreateFixture(_linkFixture);
					revoluteJoint(_circle, _link, new b2Vec2(0, 0), new b2Vec2(0, -chainLength / Box2DHelpers.meters));
				} else {
					var newLink:b2Body =  Box2DHelpers.world.CreateBody(_linkDef);
					newLink.CreateFixture(_linkFixture);
				 revoluteJoint(_link, newLink, new b2Vec2(0, chainLength / Box2DHelpers.meters), new b2Vec2(0, -chainLength / Box2DHelpers.meters));
					_link = newLink;
				}
			}
 
 
			var _box:b2Body; //тело
			var _boxDef:b2BodyDef; //геометрические параметры тела
			var _boxShapePoligon:b2PolygonShape; //шейп
			var _boxFixture:b2FixtureDef; //физические параметры тела
 
			_boxDef = new b2BodyDef(); //создаем геометрические параметры тела
			_boxDef.position.Set(797 / Box2DHelpers.meters, 335 / Box2DHelpers.meters); //определяем начальные позиции тела
			//_boxDef.angle = rot * Math.PI / 180
			_boxDef.type = b2Body.b2_dynamicBody;
 
			_boxShapePoligon = new b2PolygonShape();  //создаем шейп
			_boxShapePoligon.SetAsBox((1 / 2) / Box2DHelpers.meters, (190 / 2) / Box2DHelpers.meters); //w-ширина тела, h-выстота тела
 
			_boxFixture = new b2FixtureDef(); //создаем объект крепим к телу объект
			_boxFixture.shape = _boxShapePoligon; //записываем ссылку на шейп. ОБЯЗАТЕЛЬНО
			_boxFixture.density = 2; //плотность
			_boxFixture.friction = 0.3; //трение
			_boxFixture.restitution = 0.1; //упругость
			_box = Box2DHelpers.world.CreateBody(_boxDef); //ссылка на мир
			_box.CreateFixture(_boxFixture); //крепим к телу объект
 
 
			// прикрепляем дощечку к концу цепи
			 revoluteJoint(_link, _box, new b2Vec2(0, chainLength / Box2DHelpers.meters), new b2Vec2(0, 2.5));
 
			 if (Box2DHelpers.isMouseDown){ //если кнопка мыши нажата
 
			var body:b2Body = GetBodyAtMouse(); //получаем ссылку на тело которое находится под курсором мыши
 
			if (body){
		}
 
		 Box2DHelpers.world.DestroyJoint(d_Joint);//удаляем его соединение
		}
		}
За основу взял функцию MouseDrag() из Box2DHelpers. Пытаюсь её переделать под этот случай, но не выходит( Выкладываю исходник, чтобы наглядней было.
Test.rar

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

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

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


 


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


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