Membuat Senjata Melee di Box2D (libGDX)

10

Saya berjuang dengan cara menerapkan senjata jarak dekat yang dapat berayun ketika tombol ditekan.

Saya membayangkan dua serangan berbeda (tikaman dan ayunan)

Saya telah mencoba membuat dua perlengkapan (karakter + senjata), dua tubuh yang berbeda, dua tubuh yang berbeda + sambungan revolute, tetapi saya tidak dapat membuat kode untuk berperilaku seperti yang saya bayangkan. bayangan saya

MENUSUK:

Jadi dengan menekan sebuah tombol, sebuah body / fixture (sensor) akan keluar selama ~ 1 detik dan kemudian menghilang (atau, body / fixture selalu berada di hero dan hanya memutar 90 derajat di sekitar vertex ketika ditekan, dan kemudian putar kembali ke normal)

AYUNAN:

Hal yang sama, tetapi sekarang senjata akan mulai dari atas dan berayun ke bawah. Senjata juga akan menjadi sensor.

Apa yang saya coba:

Saya membuat dua tubuh yang dinamis.

Senjatanya harus mengikuti pahlawan, jadi saya menggunakan revolute joint untuk menyatukan mereka. Ketika tombol ditekan, saya mengatur kecepatan sudut senjata ke angka. Namun, senjatanya akan terus berputar setelah aku melepaskan kuncinya. Saya mencoba menerapkan cek jika (jika sudut lebih besar dari ___, atur kecepatan sudut ke nol). Namun, itu hanya berarti senjata akan berhenti berputar ketika saya menekan tombol untuk kedua kalinya.

quidproquo
sumber
Karena Anda telah membuat badan / perlengkapan berbentuk persegi panjang, Anda hanya perlu memutar badan pedang 90 derajat ke kanan untuk animasi ayunan. Anda juga perlu mematikan tabrakan tubuh pedang, ketika animasi tidak terjadi, dan tidak menggambarnya di layar. Animasi tusukan hanyalah versi sederhana dari ayunan, di mana pedang memiliki sudut awal yang berbeda. Bukankah ini benar? Cukup sederhana buat saya. Di mana Anda terjebak?
dimitris93
Apakah masalahnya pedang dan pahlawan yang tumpang tindih? mungkin tubuh persegi kecil bisa menjadi ujung pedang sehingga tidak pernah tumpang tindih. mungkin edit untuk info lebih lanjut
drumbumLOLcatz
@ Siro saya memasukkan upaya saya di bagian bawah. Saat ini saya terjebak karena saya tidak tahu bagaimana memulai dan menghentikan rotasi dalam satu tekan tombol.
quidproquo
Ya rasanya seperti pertanyaan Anda yang sebenarnya adalah bagaimana memutar objek pada tombol tekan
dimitris93

Jawaban:

1

Kebetulan, saya telah melakukan persis apa yang Anda coba lakukan. Satu-satunya tangkapan adalah saya menggunakan Jbox2d jadi kodenya ada di Java, tetapi Anda harus tetap bisa mengetahuinya jika Anda menggunakan C ++

Anda pada dasarnya perlu menggunakan sendi / motor dan semua hal menyenangkan jika Anda ingin melakukan aksi berayun. Berikut cuplikan tampilan kode saya berdasarkan input kunci:

    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;

    }

Dan sejauh benar-benar membangun lengan dan yang lainnya, potongannya terlihat seperti ini.

    // 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);

Saya menyadari ada banyak hal yang terjadi di sini, tetapi mungkin lebih mudah jika Anda bertanya kepada saya apa yang perlu Anda jelaskan dan saya jelaskan. Jika Anda belum pernah menggunakan hal-hal ini, Anda mungkin perlu melakukan sedikit bacaan yang adil.

Sunting >>

Sadarilah, Box2d memiliki semua deteksi tabrakan dan fisika dibangun bersih ke perpustakaannya. Ambillah keyakinan ketika saya mengatakan, lebih mudah untuk mengetahui sistem mereka daripada mencoba dan melakukan sesuatu dari awal. Jika Anda ingin tabrakan, Anda menggunakan bodydef perlengkapan, jika Anda ingin mereka berputar atau bergerak, Anda menggunakan sendi. Awalnya mungkin terlihat sedikit lebih rumit, tetapi pada akhirnya menghemat waktu Anda tanpa batas untuk menggunakan metode mereka.

Bahkan, saya akan menyarankan bahwa Anda mungkin tidak akan pernah selesai jika Anda mencoba dan melakukan sesuatu dari awal, dengan asumsi Anda membuat permainan fisika. Karena menghitung hal-hal seperti gesekan, daya apung dan belum lagi, / deteksi efisien / tabrakan, akan membawa Anda seumur hidup.

bigcodeszzer
sumber
0

Saya telah menemukan semacam pemecahan masalah ini, tetapi saya tidak yakin apakah ini cara yang baik untuk kode.

Ketika tombol ditekan, saya mengatur kecepatan sudut ke 10 dan kemudian pada setiap pembaruan, saya memintanya untuk memeriksa

    if(weapon.getAngle() >= Math.PI / 2) {
        weapon.setAngularVelocity(-10);
    }
    if(weapon.getAngle() <= 0) {
        weapon.setAngularVelocity(0);
    }
quidproquo
sumber
Di dalam if(weapon.getAngle() <= 0)Anda juga harus meletakkannya secara manual di sudut tertentu yang Anda inginkan, jika tidak maka tidak akan tepat dan Anda perlu if-elsepernyataan bukan if-if. Itu datang ke coding java dasar tidak terlalu banyak hubungannya dengan masalah spesifik game.
dimitris93
0

Dari apa yang Anda katakan, sepertinya Anda juga harus memindahkan kode yang mengatur ulang kecepatan sudut setelah sudut tertentu tercapai. Saya menduga bahwa kode ini hanya digunakan ketika tombol ditekan, karena Anda mengatakan menekan tombol untuk kedua kalinya membuat gerakan berhenti (dan dengan demikian membuat kode pengujian bekerja).

Jika demikian, Anda dapat memindahkannya ke pernyataan 'lain' setelah kode yang menguji jika tombol ditekan.

capung
sumber
0

Satu hal yang bisa Anda lakukan adalah pada perintah, jalankan metode yang akan membuat tubuh relatif terhadap posisi tubuh utama menggunakan body.getPosition.set (); atur bit filter agar tidak bertabrakan, kemudian atur kecepatan linier atau berikan gaya, apa pun yang Anda ingin pindahkan ke depan setelah memulai timer untuk dihancurkan setelah x jumlah loop game

Atau Anda bisa melakukan hal yang sama tetapi malah menciptakan jarak bersama dikombinasikan dengan bersama prismatik hanya sepanjang sumbu x untuk membuat gerakan mendorong tiba-tiba dengan bertabrakan yang terhubung menjadi palsu sehingga tidak bertabrakan dengan badan utama opsi ini akan mungkin bekerja lebih baik,

untuk serangan ayun, buat tubuh serupa memutar setengah pi dengan hanya ujung pedang yang terhubung ke tubuh utama dengan bertabrakan yang terhubung dengan false tentu saja, maka Anda dapat menerapkan kekuatan motor pada sambungan dan dorongan sudut ke tubuh pedang menghancurkannya setelah rotasi set tubuh tercapai atau waktu tertentu telah terjadi,

jika diperlukan bantuan tambahan, cukup beri komentar di bawah ini

Youseflapod
sumber