在Box2D(libGDX)中创建近战武器


10

我正在努力实现一种近战武器,该武器可以在按下键时摆动。

我正在想象两种不同的攻击方式(刺和挥杆)

我尝试创建两个固定装置(角色+武器),两个不同的物体,两个不同的物体+旋转关节,但是我无法对其进行编码,使其行为符合我的想象。 我的想象

刺:

因此,只要按一下按钮,身体/固定装置(传感器)就会出现约1秒钟,然后消失(或者,身体/固定装置始终可以位于英雄身上,并且在按下时围绕顶点旋转90度,并且然后旋转回正常)

摇摆:

同样,但是现在武器将从顶部开始向下旋转。武器也将成为传感器。

我尝试过的

我创建了两个动态物体。

武器必须跟随英雄,因此我使用了旋转关节将它们固定在一起。当按键时,我将武器的角速度设置为一个数字。但是,放开钥匙后,武器将继续旋转。我尝试执行if检查(如果角度大于___,请将角速度设置为零)。但是,这仅意味着当我再次按下该键时,武器将停止旋转。


由于您已经制作了矩形的主体/夹具,因此只需将剑主体向右旋转90度即可进行挥杆动画。另外,当动画不发生时,您需要关闭剑体的碰撞,并且不要在屏幕上绘制它。刺杀动画只是挥杆的简单版本,其中剑的起始角度不同。这不是吗?对我来说似乎很简单。你困在哪里?
dimitris93

问题是剑与英雄的重叠吗?也许一个小的方形物体可能是剑尖,所以它永远不会重叠。或许可以编辑一些更多的信息
drumbumLOLcatz 2015年

@Shiro我在底部列出了我的尝试。现在,我被卡住了,因为我不知道如何通过一键启动和停止旋转。
2015年

是的,您的实际问题是如何在按键上旋转对象
dimitris93 2015年

Answers:


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,如果要旋转或移动它们,请使用关节。乍一看似乎有些复杂,但最后它可以为您节省更多的时间来使用它们的方法。

实际上,我建议假设您正在创建物理游戏,那么如果您尝试从头开始做某事,您可能永远也不会完成。因为计算诸如摩擦,浮力之类的东西,更不用说,/ efficiency /碰撞检测,将使您终生难忘。


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 2015年

0

用你的话来说,似乎还必须简单地移动到达一定角度后重新设置角速度的代码。我怀疑此代码仅在按下按钮时使用,因为您说第二次按下按钮会使移动停止(从而使测试代码起作用)。

如果是这种情况,您可以在测试是否按下该键的代码之后将其移至“ else”语句。


0

您可以做的一件事是在命令中运行一种方法,该方法将使用body.getPosition.set()创建相对于主体位置的主体。设置过滤器位使其不发生碰撞,然后设置线速度或施加力,无论您希望在启动计时器后将其向前移动以破坏x次游戏循环

或者,您也可以执行相同的操作,但只能在x轴上创建一个距离关节和一个棱柱形关节的组合,以突然推开运动,并且碰撞连接为假,这样它就不会与主体碰撞。可能会更好地工作,

对于挥杆攻击,请创建一个类似的主体,将其旋转pi的一半,只将剑的剑尖连接到主体,同时将碰撞连接到相等的假点,然后可以在关节上施加动力,向剑体施加角度冲量在达到设定的旋转角度或发生一定时间后将其销毁,

如果需要其他帮助,请在下面评论

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.