Кстати, я сделал именно то, что вы пытаетесь сделать. Единственная загвоздка в том, что я использовал Jbox2d, поэтому код написан на Java, но вы все равно сможете понять это, если используете C ++.
В основном вам нужно использовать суставы / моторы и все эти забавные вещи, если вы хотите заниматься качанием. Вот фрагмент того, как мой код выглядит на основе ввода ключа:
if (myinput.mouse0) {
agents.get(0).rightForeJoint.enableMotor(true);
agents.get(0).rightArmJoint.enableMotor(false);
if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)){
agents.get(0).rightForeJoint.enableMotor(false);
}
mouseY = Mouse.getY();
mouseX = Mouse.getX();
float temp = mouseY - prevPos[1];
float temp2 = -mouseX + prevPos[0];
temp2 *= modifier; temp2 *= 0.000026;
temp *= modifier; temp *= 0.000030;
agents.get(0).armR.applyAngularImpulse(-temp);
agents.get(0).foreR.applyAngularImpulse(temp2);
prevPos[1] = mouseY;
prevPos[0] = mouseX;
if(temp2 < 0){
temp2 *=-1;
}
if(temp < 0){
temp *=-1;
}
fatigueDrain += temp2;
fatigueDrain += temp;
}
А затем, что касается создания оружия и тому подобного, фрагмент выглядит следующим образом.
// RIGHTARM //
this.rightArmDef = new RevoluteJointDef();
this.rightArmDef.bodyA = this.torso ; this.rightArmDef.bodyB = this.armR;
this.rightArmDef.collideConnected = false;
torso_armL_pin = new Vec2(0.50f, +0.05f);
local_armL_pin = new Vec2(0.14f, 0.14f);
this.rightArmDef.localAnchorA.set(this.torso.getLocalCenter().add(torso_armL_pin));
this.rightArmDef.localAnchorB.set(this.armR.getLocalCenter().add(local_armL_pin));
this.rightArmDef.enableMotor = true;
this.rightArmDef.motorSpeed = 0f;
this.rightArmDef.maxMotorTorque =10f;
this.rightArmDef.enableLimit = true;
this.rightArmDef.lowerAngle = 1.2f;// * DEGTORAD;
this.rightArmDef.upperAngle = 5;
this.rightArmJoint = (RevoluteJoint)world.createJoint(this.rightArmDef);
Я понимаю, что здесь много чего происходит, но, вероятно, будет проще, если вы просто спросите меня, что вам нужно, и я объясню это. Если вы никогда не использовали ничего из этого, вам, вероятно, придется немного почитать.
EDIT >>
Поймите, Box2d имеет все обнаружение столкновений и физику, встроенную в свои библиотеки. Примите это к сведению, когда я говорю, что легче понять их систему, чем пытаться делать все с нуля. Если вы хотите столкновения, вы используете приборы bodydefs, если вы хотите, чтобы они вращались или двигались, вы используете суставы. Поначалу это может показаться немного сложнее, но, в конце концов, это экономит вам бесконечно больше времени на использование их методов.
На самом деле, я бы предположил, что вы, вероятно, никогда не закончите, если будете пытаться делать что-то с нуля, предполагая, что вы создаете физическую игру. Потому что вычисление таких вещей, как трение, плавучесть и не говоря уже о / эффективном / обнаружении столкновений, займет у вас всю жизнь.