|
|||||||
Пример на Flash по объекту b2MouseJoin, попробовать сделать то же самое в C++
Время создания: 29.11.2017 23:20
Раздел: Компьютер - Программирование - Физические движки - Box2D
Запись: xintrea/mytetra_syncro/master/base/1511986807rbxjs0lej1/text.html на raw.github.com
|
|||||||
|
|||||||
// Объект соединения тела и курсора мышки private var _mJoint: b2MouseJoint;
private function GetBodyAtMouse(includeStatic:Boolean = false): b2Body { var mXWorldPhys: Number = mouseX * MPP; var mYWorldPhys: Number = mouseY * MPP; var mousePVec: b2Vec2 = new b2Vec2(mXWorldPhys, mYWorldPhys);//записываем текущие координаты курсора var aabb: b2AABB = new b2AABB(); // создаем прямоугольную область aabb.lowerBound.Set(mXWorldPhys - 0.001, mYWorldPhys - 0.001); //вокруг курсора мыши aabb.upperBound.Set(mXWorldPhys + 0.001, mYWorldPhys + 0.001); var body: b2Body = null; var fixture: b2Fixture; function GetBodyCallback(fixture:b2Fixture): Boolean { var shape:b2Shape = fixture.GetShape(); //получаем шейп который находится под курсором // если тело не статическое if (fixture.GetBody().GetType() != b2Body.b2_staticBody || includeStatic) { // проверяем находится ли точка-позиция курсора в рамках тела var inside: Boolean = shape.TestPoint(fixture.GetBody().GetTransform(), mousePVec); // если да if (inside) { body = fixture.GetBody(); //получаем ссылку на тело return false; } } return true; } _world.QueryAABB(GetBodyCallback, aabb); //проверяем на попадание любых тел в область aabb return body; //возвращаем тело }
// Клик по клавише мышки private function onMouseDown(e:MouseEvent):void { // если соединение уже есть, то уничтожаем его if (_mJoint) destroyCurrentJoint(); // получаем тело под курсором var body:b2Body = GetBodyAtMouse(); if (body) { var md:b2MouseJointDef = new b2MouseJointDef(); //создаем настройки соединения md.bodyA = _world.GetGroundBody(); //один конец крепим к миру md.bodyB = body; //другой к телу md.target.Set(mouseX * MPP, mouseY * MPP); //соединение создается от курсора мыши md.collideConnected = true; md.maxForce = 3000; //макс. сила которая может быть приложена к телу _mJoint = _world.CreateJoint(md) as b2MouseJoint; //создаем соединение body.SetAwake(true); //будим тело } } // Получение ground body в C++ в box2d 2.x.x, чтобы прикрепить к миру b2BodyDef bd; m_groundBody = CreateBody(&bd);
private function destroyCurrentJoint():void { if (_mJoint) _world.DestroyJoint(_mJoint); // удаляем соединение _mJoint = null; }
private function onMouseUp(e:MouseEvent):void { destroyCurrentJoint(); }
private function onEnterFrameHandler(e:Event):void { updateBox2D(1 / stage.frameRate);
if (_mJoint) { //если кнопка мыши нажата и соединение уже существует var p2:b2Vec2 = new b2Vec2(mouseX * MPP, mouseY * MPP); _mJoint.SetTarget(p2); //перемещаем соединение за курсором мыши } }
}
} |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|