Tworzenie broni białej w Box2D (libGDX)


10

Walczę z tym, jak wdrożyć broń do walki w zwarciu, która może się zamachać po naciśnięciu klawisza.

Wyobrażam sobie dwa różne ataki (dźgnięcie i zamach)

Próbowałem utworzyć dwa urządzenia (postać + broń), dwa różne ciała, dwa różne ciała + złącze obrotowe, ale nie mogę zakodować go tak, aby zachowywał się tak, jak sobie wyobrażam. wyobraźnia

ZASZTYLETOWAĆ:

Tak więc po naciśnięciu przycisku ciało / urządzenie (czujnik) wyjdzie na ~ 1 sekundę, a następnie zniknie (alternatywnie ciało / urządzenie może zawsze znajdować się na bohaterze i po naciśnięciu obraca się o 90 stopni wokół wierzchołków, i następnie obróć z powrotem do normy)

HUŚTAWKA:

To samo, ale teraz broń zacznie się od góry i opadnie. Broń będzie również czujnikiem.

Co próbowałem:

Stworzyłem dwa dynamiczne ciała.

Broń musi podążać za bohaterem, więc użyłem obrotowego stawu, żeby je trzymać. Po naciśnięciu klawisza ustawiam prędkość kątową broni na liczbę. Jednak broń nadal będzie się kręcić po zwolnieniu klucza. Próbowałem zaimplementować sprawdzenie if (jeśli kąt jest większy niż ___, ustaw prędkość kątową na zero). Oznacza to jednak, że broń przestanie się obracać, gdy ponownie naciśniesz klawisz.


Ponieważ wykonałeś już ciała / uchwyty w kształcie prostokąta, po prostu musiałbyś obrócić korpus miecza o 90 stopni w prawo, aby uzyskać animację huśtania. Musisz także wyłączyć kolizje ciała miecza, gdy animacja nie występuje, i nie rysować go na ekranie. Animacja dźgnięcia jest po prostu prostszą wersją zamachu, w której miecz ma inny kąt początkowy. Czy to nie prawda? Wydaje mi się to dość proste. Gdzie utknąłeś?
dimitris93

Czy problemem jest nakładający się miecz i bohater? może małe kwadratowe ciało może być ostrzem miecza, aby nigdy się nie zachodziło. może edytuj, aby uzyskać więcej informacji
drumbumLOLcatz

@Shiro Podałem moje próby na dole. W tej chwili utknąłem, ponieważ nie wiem, jak rozpocząć i zatrzymać obrót jednym naciśnięciem klawisza.
quidproquo

Tak, wydaje się, że twoje prawdziwe pytanie brzmi: jak obrócić obiekt po naciśnięciu klawisza
dimitris93

Odpowiedzi:


1

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.


0

Znalazłem jakieś obejście tego problemu, ale nie jestem pewien, czy jest to dobry sposób na kodowanie.

Po naciśnięciu klawisza ustawiam prędkość kątową na 10, a następnie przy każdej aktualizacji proszę o sprawdzenie

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

Wewnątrz if(weapon.getAngle() <= 0)należy również ręcznie ustawić go pod określonym kątem, w przeciwnym razie nie będzie on precyzyjny i if-elsezamiast tego potrzebujesz instrukcji if-if. Wszystko sprowadza się do podstawowego kodowania Java, które nie ma wiele wspólnego z konkretnym problemem związanym z grą.
dimitris93

0

Z tego, co mówisz, wydaje się, że możesz po prostu przesunąć kod, który resetuje prędkość kątową po osiągnięciu określonego kąta. Podejrzewam, że ten kod jest używany tylko po naciśnięciu przycisku, ponieważ mówienie, że naciśnięcie przycisku po raz drugi powoduje zatrzymanie ruchu (a tym samym działa kod testowy).

W takim przypadku można przenieść go do instrukcji „else” po kodzie, który sprawdza, czy klawisz został naciśnięty.


0

Jedną rzeczą, którą możesz zrobić, jest polecenie, uruchom metodę, która utworzy ciało względem pozycji głównego ciała za pomocą body.getPosition.set (); ustaw bity filtra tak, aby nie kolidowały, a następnie ustaw prędkość liniową lub zastosuj siłę, cokolwiek chcesz przesunąć do przodu po uruchomieniu timera, aby zniszczyć po x liczbie pętli gry

Lub możesz zrobić to samo, ale zamiast tego utworzyć połączenie dystansowe połączone z pryzmatycznym połączeniem tylko wzdłuż osi x, aby wykonać nagły ruch odepchnięcia ze zderzeniem połączonym z fałszem, aby nie kolidował z głównym korpusem, ta opcja prawdopodobnie działa lepiej,

dla ataku zamachu stwórz podobne ciało obrócone o połowę pi, mając tylko czubek miecza połączony z głównym ciałem, a zderzenie połączone z równym fałszem, oczywiście, wtedy możesz przyłożyć siłę motoryczną do stawu i impuls kątowy na korpus miecza niszczenie go po osiągnięciu ustalonego obrotu ciała lub po upływie określonego czasu,

jeśli potrzebujesz dodatkowej pomocy, po prostu skomentuj poniżej

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.