Ngẫu nhiên, tôi đã làm chính xác những gì bạn đang cố gắng làm. Điều hấp dẫn duy nhất là tôi đang sử dụng Jbox2d vì vậy mã nằm trong Java, nhưng bạn vẫn có thể tìm ra nếu bạn đang sử dụng C ++
Về cơ bản bạn cần sử dụng khớp / động cơ và tất cả những thứ thú vị đó nếu bạn muốn thực hiện hành động lắc lư. Đây là một đoạn mã về mã của tôi trông như thế nào dựa trên đầu vào khóa:
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;
}
Và sau đó thực sự xây dựng các cánh tay và không có gì, đoạn trích trông như thế này.
// 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);
Tôi nhận ra có rất nhiều điều đang diễn ra ở đây, nhưng có lẽ sẽ dễ dàng hơn nếu bạn chỉ hỏi tôi những gì bạn cần rõ ràng và tôi giải thích nó. Nếu bạn chưa bao giờ sử dụng bất kỳ thứ gì trong số này, có lẽ bạn sẽ cần phải đọc một chút công bằng.
CHỈNH SỬA >>
Nhận ra, Box2d có tất cả các phát hiện va chạm và vật lý được xây dựng sạch sẽ trong các thư viện của nó. Hãy tin vào điều đó khi tôi nói, sẽ dễ dàng tìm ra hệ thống của họ hơn là thử và làm mọi thứ từ đầu. Nếu bạn muốn va chạm, bạn sử dụng đồ đạc bodydefs, nếu bạn muốn chúng xoay hoặc di chuyển, bạn sử dụng khớp. Ban đầu có vẻ phức tạp hơn một chút, nhưng cuối cùng, nó giúp bạn tiết kiệm thời gian hơn rất nhiều để sử dụng các phương pháp của họ.
Trên thực tế, tôi sẽ đề nghị rằng bạn có thể sẽ không bao giờ hoàn thành nếu bạn cố gắng và làm mọi thứ từ đầu, giả sử bạn đang tạo ra một trò chơi vật lý. Bởi vì những thứ điện toán như ma sát, độ nổi và không đề cập đến, / hiệu quả / phát hiện va chạm sẽ khiến bạn mất cả cuộc đời.