顺便说一句,我完全按照您的意愿去做。唯一的问题是我使用的是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,如果要旋转或移动它们,请使用关节。乍一看似乎有些复杂,但最后它可以为您节省更多的时间来使用它们的方法。
实际上,我建议假设您正在创建物理游戏,那么如果您尝试从头开始做某事,您可能永远也不会完成。因为计算诸如摩擦,浮力之类的东西,更不用说,/ efficiency /碰撞检测,将使您终生难忘。