Box2D'de (libGDX) Yakın Dövüş Silahı Oluşturma


10

Bir tuşa basıldığında sallanabilen yakın dövüş silahının nasıl uygulanacağıyla uğraşıyorum.

İki farklı saldırı (bıçak ve salıncak) hayal ediyorum

İki fikstür (karakter + silah), iki farklı gövde, iki farklı gövde + revolute eklem oluşturmayı denedim, ancak benzediğini hayal ettiğim şekilde davranması için kodlayamıyorum. benim hayalgücüm

STAB:

Bu nedenle, bir düğmeye basıldığında, bir gövde / fikstür (sensör) ~ 1 saniye boyunca çıkar ve sonra kaybolur (alternatif olarak, gövde / fikstür her zaman kahraman üzerinde olabilir ve basıldığında yalnızca köşelerin 90 derece etrafında dönebilir ve sonra normale dön)

SWING:

Aynı şey, ama şimdi silah üstten başlayıp aşağı doğru sallanacak. Silah da bir sensör olacak.

Ne denedim:

İki dinamik gövde oluşturdum.

Silahın kahramanı takip etmesi gerekiyor, bu yüzden onları bir arada tutmak için iğrenç bir eklem kullandım. Bir tuşa basıldığında, silahın açısal hızını bir sayıya ayarladım. Ancak anahtarı bıraktıktan sonra silah dönmeye devam edecek. Bir if kontrolü uygulamayı denedim (açı ___ 'dan büyükse, açısal hızı sıfıra ayarlayın). Ancak bu, tuşa ikinci kez bastığımda silahın dönmeyi bırakacağı anlamına geliyor.


Dikdörtgen şekilli gövdeleri / fikstürleri zaten yapmış olduğunuzdan, kılıç gövdesini salıncak animasyonu için 90 derece sağa döndürmeniz gerekir. Ayrıca, animasyon meydana gelmediğinde kılıç gövdesinin çarpışmalarını kapatmanız ve ekranda çizmemeniz gerekir. Bıçak animasyonu, kılıcın farklı bir başlangıç ​​açısına sahip olduğu, sadece daha basit bir salıncak versiyonudur. Bu doğru değil mi? Bana oldukça basit görünüyor. Nereye takıldın?
dimitris93

Sorun üst üste binen kılıç ve kahraman mı? belki küçük bir kare gövde kılıç ucu olabilir, bu yüzden asla örtüşmez. belki daha fazla bilgi için düzenle
drumbumLOLcatz

@Shiro Denemelerimi en alta dahil ettim. Şu anda takılıp kaldım çünkü bir tuşa basarak rotasyonu nasıl başlatacağımı ve durduracağımı bilmiyorum.
QuidProQuo

Evet, asıl sorunuz, bir nesneyi tuşa basarken nasıl döndüreceğinizi hissettiriyor
dimitris93

Yanıtlar:


1

Bu arada, tam olarak yapmaya çalıştığın şeyi yaptım. Tek yakalama Jbox2d kodunu Java'da kullanıyordum, ama yine de C ++ kullanıyorsanız bunu anlayabilmelisiniz

Salıncak hareketi yapmak istiyorsanız, eklemleri / motorları ve tüm bu eğlenceli şeyleri kullanmanız gerekir. Anahtar girdisine dayanarak kodumun neye benzediğini gösteren bir snippet:

    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;

    }

Ve sonra aslında silahları inşa etmek ve ne olursa olsun, snippet buna benziyor.

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

Burada çok şey olduğunu anlıyorum, ama bana netlik için neye ihtiyacınız olduğunu sorarsanız muhtemelen daha kolay ve bunu açıklıyorum. Bunlardan herhangi birini hiç kullanmadıysanız, muhtemelen oldukça fazla okuma yapmanız gerekecektir.

DÜZENLEME >>

Box2d, kütüphanelerine temiz bir şekilde yerleştirilmiş tüm çarpışma algılama ve fiziğe sahiptir. Söylediğimde, inançlarını benimseyin, sistemlerini anlamak, işleri sıfırdan yapmaktan daha kolaydır. Çarpışma istiyorsanız, fikstür gövdelerini kullanırsınız, döndürmelerini veya hareket etmelerini istiyorsanız, eklemleri kullanırsınız. İlk başta biraz daha karmaşık görünebilir, ancak sonunda yöntemlerini kullanmak için size sonsuz zaman kazandırır.

Aslında, bir fizik oyunu oluşturduğunuzu varsayarak, sıfırdan bir şeyler yapmaya çalışırsanız muhtemelen asla bitmeyeceğinizi öneririm. Çünkü sürtünme, yüzdürme ve bahsetmeme gibi şeyleri hesaplamak, / verimli / çarpışma tespiti, size bir ömür kazandıracaktır.


0

Bu geçici çözüm bir tür bulduk, ama bu kodlamak için iyi bir yol olup olmadığından emin değilim.

Bir tuşa basıldığında açısal hızı 10'a ayarlıyorum ve her güncellemede kontrol etmesini istiyorum

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

İçinde if(weapon.getAngle() <= 0)de manuel olarak istediğiniz belirli bir açıyla koymalısınız, aksi takdirde kesin olmayacaktır ve if-elsebunun yerine ifadeye ihtiyacınız vardır if-if. Oyuna özgü sorunla pek alakası olmayan temel java kodlamaya geliyor.
dimitris93

0

Söylediklerinizden, belli bir açıya ulaşıldıktan sonra açısal hızı sıfırlayan kodu hareket ettirmeniz gerekebilir. Bu kodun yalnızca düğmeye basıldığında kullanıldığından şüpheleniyorum, çünkü düğmeye ikinci kez basmak hareketi durdurur (ve böylece test kodunun çalışmasını sağlar).

Bu durumda, tuşa basıldığını test eden koddan sonra bir 'else' ifadesine taşıyabilirsiniz.


0

Yapabileceğiniz bir şey komut üzerindeyse, body.getPosition.set () kullanarak ana gövdenin konumuna göre bir gövde oluşturacak bir yöntem çalıştırın. filtre bitlerini çarpışmayacak şekilde ayarlayın, daha sonra x oyun döngü sayısından sonra yok etmek için bir zamanlayıcı başlattıktan sonra ileriye taşımak istediğiniz her şeyden sonra doğrusal hızı veya kuvveti uygulayın

Ya da aynı şeyi yapabilirsiniz, ancak bunun yerine ana eksenle çarpışmayacak şekilde çarpışmaya bağlı çarpışma ile ani bir itme hareketi yapmak için sadece x ekseni boyunca prizmatik bir eklem ile birleştirilmiş bir mesafe eklemi oluşturmak, bu seçeneğin muhtemelen daha iyi çalışır,

Bir salıncak saldırısı için pi'nin yarısını döndüren benzer bir vücut oluşturun, sadece kılıcın ucu ana gövdeye bağlı, çarpışmanın eşit yanlışlığa bağlı olduğu için, elbette eklem üzerine motor kuvvetini kılıç gövdesine açısal bir dürtü uygulayabilirsiniz vücudun belirli bir dönüşü sağlandıktan veya belirli bir süre geçtikten sonra onu yok etmek,

Ekstra yardıma ihtiyaç duyulursa, aşağıya yorum yapın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.