До речі, я зробив саме те, що ви намагаєтеся зробити. Єдина уловка - це те, що я використовував 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);
Я усвідомлюю, що тут багато чого відбувається, але, мабуть, простіше, якщо ви просто запитаєте мене, для чого вам потрібна ясність, і я пояснюю це. Якщо ви ніколи не використовували жодної з цих речей, вам, ймовірно, доведеться трохи читати.
РЕДАКТИВАТИ >>
Зрозумійте, Box2d має всі бібліотеки виявлення зіткнень та фізику, вбудовану в чистоту. Поставте це на віру, коли я кажу, простіше розібратися в їхній системі, ніж намагатися робити щось з нуля. Якщо ви хочете зіткнення, ви використовуєте світильники bodydefs, якщо ви хочете, щоб вони оберталися або рухалися, ви використовуєте суглоби. Спочатку це може здатися трохи складнішим, але зрештою це заощаджує вам нескінченно більше часу для використання їх методів.
Насправді я б припустив, що ви, мабуть, ніколи не закінчите, якщо будете намагатися робити щось з нуля, припускаючи, що створюєте фізичну гру. Тому що обчислення речей, таких як тертя, плавучість і не кажучи вже про / ефективне / виявлення зіткнень, забере у вас все життя.