Box2D (libGDX)에서 근접 무기 만들기


10

키를 누를 때 흔들릴 수있는 근접 무기를 구현하는 방법에 어려움을 겪고 있습니다.

나는 두 가지 다른 공격을 상상하고 있습니다 (stab과 swing)

나는 두 개의 조명기 (캐릭터 + 무기), 두 개의 다른 바디, 두 개의 다른 바디 + 회전 조인트를 만들려고 시도했지만, 내가 생각하는 것처럼 행동하도록 코딩 할 수는 없습니다. 내 상상력

찌르다:

따라서 버튼을 누르면 바디 / 픽스처 (센서)가 ~ 1 초 동안 나온 다음 사라집니다 (또는 바디 / 픽스처는 항상 영웅 위에있을 수 있으며 누를 때 꼭 정점 주위로 90도 회전 할 수 있습니다. 그런 다음 다시 정상으로 회전)

그네:

같은 것이지만 이제는 무기가 위에서부터 시작하여 아래로 흔들립니다. 무기도 센서가 될 것입니다.

내가 시도한 것 :

두 개의 동적 바디를 만들었습니다.

무기는 영웅을 따라 가야하므로 회전 조인트를 사용하여 묶었습니다. 키를 누르면 무기의 각속도를 숫자로 설정합니다. 그러나 열쇠를 놓아도 무기는 계속 회전합니다. if 검사 (각도가 ___보다 큰 경우 각 속도를 0으로 설정)를 구현하려고했습니다. 그러나 이것은 키를 두 번 누르면 무기가 회전을 멈추는 것을 의미합니다.


사각형 모양의 바디 / 픽스처를 이미 만들었으므로 스윙 애니메이션을 위해 칼 바디를 오른쪽으로 90도 회전하면됩니다. 또한 애니메이션이 발생하지 않을 때 검 바디의 충돌을 끄고 화면에 그리지 않아야합니다. 찌르기 애니메이션은 칼의 시작 각도가 다른 단순한 스윙 버전입니다. 이것이 맞지 않습니까? 나에게는 매우 간단 해 보인다. 어디에서 멈 췄어?
dimitris93 2016 년

문제가 겹치는 검과 영웅입니까? 어쩌면 작은 정사각형 몸체가 칼 끝이 될 수 있으므로 겹치지 않습니다. 아마 좀 더 자세한 정보를 위해 편집
drumbumLOLcatz

@ 시로 나는 하단에 내 시도를 포함시켰다. 지금은 한 번의 키 누름으로 회전을 시작하고 중지하는 방법을 모르기 때문에 붙어 있습니다.
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는 모든 충돌 감지 및 물리학을 라이브러리에 깔끔하게 구축했습니다. 내가 말할 때 믿음을 가지고, 그들의 시스템을 알아내는 것이 처음부터 시도하고하는 것보다 쉽습니다. 충돌을 원하면 조명기 bodydef를 사용하고, 회전하거나 이동하려면 조인트를 사용하십시오. 처음에는 조금 더 복잡해 보일 수 있지만 결국에는 방법을 사용하는 데 더 많은 시간을 절약 할 수 있습니다.

실제로 물리 게임을 만들고 있다고 가정하고 처음부터 다시 시도하면 결코 끝내지 않을 것이라고 제안합니다. 마찰, 부력 및 / 효율 / 충돌 감지와 같은 것을 계산하는 데 평생 걸릴 것입니다.


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 2016 년

0

당신이 말하는 것에서, 당신은 또한 특정 각도에 도달 한 후 각 속도를 재설정하는 코드를 이동해야 할 것처럼 보입니다. 이 코드는 버튼을 누를 때만 사용되는 것으로 의심됩니다. 버튼을 두 번 누르면 이동이 중지되고 테스트 코드가 작동한다고 말하기 때문입니다.

이 경우 키를 눌렀는지 테스트하는 코드 다음에 'else'문으로 옮길 수 있습니다.


0

명령을 내릴 수있는 한 가지 방법은 body.getPosition.set ();을 사용하여 본체의 위치를 ​​기준으로 바디를 만드는 메소드를 실행하는 것입니다. 필터 비트가 충돌하지 않도록 설정 한 다음, 선형 속도를 설정하거나 힘을 적용하십시오. 타이머를 시작한 후 앞으로 이동하여 x 양의 게임 루프 후에 파괴하십시오.

또는 동일한 작업을 수행 할 수 있지만 대신 x 축을 따라 프리즘 조인트와 결합 된 거리 조인트를 생성하여 충돌이 거짓으로 연결된 상태에서 갑자기 밀어 내기 동작을 만들어 본체와 충돌하지 않도록 할 수 있습니다. 아마 더 잘 작동합니다

스윙 공격의 경우 충돌이 동일한 거짓에 연결된 상태에서 본체에 연결된 칼 끝만으로 파이의 절반 만 회전하여 비슷한 몸체를 만들면 관절에 각진 힘을 가할 수 있습니다. 신체의 정해진 회전이 이루어 지거나 일정 시간이 지난 후 파괴

추가 지원이 필요한 경우 아래에 의견을 보내주십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.