ちなみに、私はあなたがやろうとしていることを正確に行いました。唯一の問題は、私が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を使用し、回転または移動する場合はジョイントを使用します。最初は少し複雑に見えるかもしれませんが、最終的には、メソッドを使用する時間を無限に節約できます。
実際、物理ゲームを作成していると仮定すると、最初からやり直した場合は決して終了しないことをお勧めします。なぜなら、摩擦、浮力、そして言うまでもなく/ efficient /衝突検出などを計算すると、一生かかるからです。