Nawiasem mówiąc, zrobiłem dokładnie to, co próbujesz zrobić. Jedynym haczykiem jest to, że używałem Jbox2d, więc kod jest w Javie, ale nadal powinieneś być w stanie go rozgryźć, jeśli używasz C ++
Zasadniczo musisz używać przegubów / silników i wszystkich innych fajnych rzeczy, jeśli chcesz wykonywać ruchy wahadłowe. Oto fragment tego, jak wygląda mój kod w oparciu o kluczowe dane wejściowe:
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;
}
A jeśli chodzi o budowanie broni i tak dalej, fragment wygląda tak.
// 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);
Zdaję sobie sprawę, że wiele się tutaj dzieje, ale prawdopodobnie łatwiej jest, jeśli zapytasz mnie, co potrzebujesz jasności, a ja to wyjaśnię. Jeśli jednak nigdy nie używałeś żadnej z tych rzeczy, prawdopodobnie będziesz musiał sporo przeczytać.
EDYCJA >>
Zdaj sobie sprawę, że Box2d ma wszystkie funkcje wykrywania kolizji i fizyki wbudowane w swoje biblioteki. Podejmij wiarę, kiedy mówię, że łatwiej jest odkryć ich system niż próbować robić wszystko od zera. Jeśli chcesz kolizji, używasz urządzeń bodydefs, jeśli chcesz je obracać lub przesuwać, używasz połączeń. Na początku może się to wydawać nieco bardziej skomplikowane, ale ostatecznie oszczędza nieskończenie więcej czasu na korzystanie z ich metod.
W rzeczywistości sugerowałbym, że prawdopodobnie nigdy nie skończysz, jeśli spróbujesz robić rzeczy od zera, zakładając, że tworzysz grę fizyki. Ponieważ obliczenia takie jak tarcie, pływalność i nie wspominając o / wydajnym / wykrywaniu kolizji, zabiorą ci całe życie.