Box2Dで近接武器を作成する(libGDX)


10

キーが押されたときにスイングできる近接武器の実装方法に苦労しています。

2つの異なる攻撃(スタブとスイング)を想像しています

2つのフィクスチャー(キャラクター+武器)、2つの異なるボディ、2つの異なるボディ+回転ジョイントを作成しようとしましたが、想像したとおりに動作するようにコーディングすることはできません。 私の想像力

刺す:

したがって、ボタンを押すと、ボディ/フィクスチャー(センサー)が約1秒間表示されてから消えます(または、ボディ/フィクスチャーは常にヒーロー上にあり、押すと頂点を中心に90度回転するだけで、その後、回転して通常に戻します)

スイング:

同じことですが、今度は武器が上から始まり、下にスイングします。武器もセンサーになります。

私が試したこと:

2つの動的ボディを作成しました。

武器はヒーローに従う必要があるので、私は回転ジョイントを使用してそれらをまとめました。キーを押すと、武器の角速度を数値に設定します。ただし、キーを離しても武器は回転し続けます。ifチェックを実装してみました(角度が___より大きい場合は、角速度をゼロに設定します)。ただし、これは、もう一度キーを押すと、武器が回転を停止することを意味します。


すでに長方形のボディ/フィクスチャーを作成しているため、スイングアニメーションを行うには、剣のボディを右に90度回転する必要があります。また、アニメーションが発生していないときは、剣の本体の衝突をオフにし、画面に描画しないようにする必要があります。刺し込みアニメーションはスイングの単純なバージョンであり、剣の開始角度が異なります。これは正しくないですか?私にはかなりシンプルに思えます。どこに行き詰まりましたか?
dimitris93 2015年

問題は剣とヒーローの重なりですか?小さな正方形のボディが剣の先端になる可能性があるため、重ならないようにしてください。いくつかの詳細は、多分編集
drumbumLOLcatz

@Shiro自分の試みを下部に含めました。現在、1回のキー操作で回転を開始および停止する方法がわからないので、行き詰まっています。
quidproquo 2015年

ええ

回答:


1

ちなみに、私はあなたがやろうとしていることを正確に行いました。唯一の問題は、私が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 /衝突検出などを計算すると、一生かかるからです。


0

私はこれに何らかの回避策を見つけましたが、これがコーディングの良い方法であるかどうかはわかりません。

キーが押されたら、角速度を10に設定し、更新のたびに確認するように要求します

    if(weapon.getAngle() >= Math.PI / 2) {
        weapon.setAngularVelocity(-10);
    }
    if(weapon.getAngle() <= 0) {
        weapon.setAngularVelocity(0);
    }

内部には、if(weapon.getAngle() <= 0)手動で特定の角度に配置する必要があります。そうしないと、正確ではif-elseなく、ではなくステートメントが必要になりますif-if。ゲーム固有の問題とはあまり関係のない基本的なJavaコーディングが原因です。
dimitris93 2015年

0

あなたが言っていることから、特定の角度に達した後、角速度をリセットするコードを単に移動する必要があるようにも思えます。このコードはボタンが押されたときにのみ使用されるのではないかと思います。ボタンを2回押すと動きが停止するため、テストコードが機能するからです。

この場合は、キーが押されたかどうかをテストするコードの後に​​ある「else」ステートメントに移動できます。


0

コマンドで実行できることの1つは、body.getPosition.set();を使用して、本体の位置を基準にして本体を作成するメソッドを実行することです。フィルタービットを衝突しないように設定し、その後、タイマーを開始した後に前進させて、ゲームループx回後に破棄するために、線速度または力を適用します。

または、同じことを行うこともできますが、代わりにx軸に沿ってのみプリズムジョイントと組み合わせた距離ジョイントを作成し、衝突がfalseに接続された状態で突然突き出すモーションを作成して、本体と衝突しないようにします。おそらくうまくいく

スイング攻撃の場合、同様のボディを作成し、piの半分だけ回転させ、剣の先端のみをメインボディに接続し、衝突はもちろんfalseに接続します。その後、関節にモーター力を加え、剣のボディに角インパルスを加えます。体の設定された回転が達成された後、または特定の時間が発生した後にそれを破壊し、

追加の支援が必要な場合は、以下にコメントしてください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.