Створення зброї ближнього бою в Box2D (libGDX)


10

Я борюся з тим, як реалізувати зброю ближнього бою, яка може розгойдуватися при натисканні клавіші.

Я уявляю дві різні атаки (удар колом)

Я спробував створити два світильника (персонаж + зброя), два різних тіла, два різних тіла + перекрутити суглоб, але я не можу кодувати це так, щоб він поводився так, як я собі уявляв. мімімація

STAB:

Тож при натисканні кнопки корпус / кріплення (датчик) вийде на ~ 1 секунду, а потім зникне (як альтернатива, корпус / кріплення завжди може бути на герої та просто обертатися на 90 градусів навколо вершин при натисканні, і потім поверніть до нормального)

SWING:

Те саме, але тепер зброя почне зверху і хитнеться вниз. Зброя також буде датчиком.

Що я спробував:

Я створив два динамічні тіла.

Зброя повинна слідувати за героєм, тому я використав революційний суглоб, щоб утримати їх разом. Коли натискається клавіша, я встановлюю кутову швидкість зброї на число. Однак зброя продовжить крутитися після того, як я відпущу ключ. Я спробував здійснити перевірку if (якщо кут більше ___, встановіть кутову швидкість до нуля). Однак це означає, що зброя перестане крутитися, коли я натискаю клавішу вдруге.


Оскільки ви вже зробили тіла / світильники у формі прямокутника, вам просто доведеться повертати корпус меча на 90 градусів праворуч для анімації гойдалки. Також потрібно вимкнути зіткнення корпусу меча, коли анімація не відбувається, і не малювати його на екрані. Анімація на ударі - це просто простіший варіант гойдалки, де меч має різний кут початку. Чи не так? Мені це здається досить простим. Де ти застряг?
dimitris93

Чи проблема перекриття меча та героя? можливо, маленьке квадратне тіло могло б бути наконечником меча, щоб воно ніколи не перекривалося. можливо, редагуйте для отримання додаткової інформації
drumbumLOLcatz

@Shiro Я включив свої спроби внизу. Зараз я застряг, бо не знаю, як запустити та зупинити обертання одним натисканням клавіші.
quidproquo

Так, власне питання полягає в тому, як повернути об’єкт при натисканні клавіші
dimitris93

Відповіді:


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, якщо ви хочете, щоб вони оберталися або рухалися, ви використовуєте суглоби. Спочатку це може здатися трохи складнішим, але зрештою це заощаджує вам нескінченно більше часу для використання їх методів.

Насправді я б припустив, що ви, мабуть, ніколи не закінчите, якщо будете намагатися робити щось з нуля, припускаючи, що створюєте фізичну гру. Тому що обчислення речей, таких як тертя, плавучість і не кажучи вже про / ефективне / виявлення зіткнень, забере у вас все життя.


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

0

З того, що ви говорите, схоже, що вам також доведеться просто перемістити код, який скидає кутову швидкість після досягнення певного кута. Я підозрюю, що цей код використовується лише при натисканні кнопки, оскільки ви говорите, що натискання кнопки вдруге змушує рух зупинятися (і, таким чином, змушує код тестування працювати).

Якщо це так, ви можете перенести його до оператора 'else' після коду, який тестує, якщо натиснути клавішу.


0

Одне, що можна зробити - це командувати, запустити метод, який створив би тіло відносно положення основного тіла за допомогою body.getPosition.set (); встановіть біти фільтра так, щоб вони не стикалися, а потім встановіть лінійну швидкість або застосуйте силу, що б ви хочете перемістити вперед після запуску таймера для знищення після х кількості ігор циклів

Або ви можете зробити те ж саме, але натомість створити дистанційний шар у поєднанні з призматичним суглобом лише вздовж осі х, щоб зробити раптовий рух виштовхування зі стиканням, який з'єднаний, щоб бути помилковим, щоб він не стикався з основним корпусом. напевно, працювати краще,

для атаки гойдалки створіть аналогічне тіло, що обертається половиною пі, лише кінчик меча з'єднаний з основним корпусом із зіткненням, рівним помилковим, звичайно, тоді ви можете застосувати рухову силу на суглоб кутовий імпульс до тіла меча руйнуючи його після досягнення встановленого обертання тіла або настання певного часу,

якщо потрібна додаткова допомога, просто прокоментуйте нижче

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.