在libGDX中处理剑动画移动的最佳方法

时间:2018-04-16 19:43:32

标签: java animation libgdx

所以我有一个角色,我做了一个矩形覆盖他的身体与敌人交叉,所以当他与敌人相交时他会受伤。我遇到的问题是,他有一把剑,剑是在他身后的某个角度,因为他随身携带它,当玩家攻击时,动画播放,剑挥动,在他的头上,并击中他的面前。我有一个多边形,在空闲/运行位置概述了剑,但我无法弄清楚是否值得尝试在攻击动画的每一帧期间手动移动多边形,然后检查每个框架中的overlapConvexPolygons动画,看看剑是否击中敌人,或者我是否应该让覆盖身体的矩形更宽,以容纳动画结束时的剑,并检查是否与敌人相交,如果是而角色正在攻击,敌人受伤而不是角色。

这很难解释,我希望它有意义。老实说,我甚至不确定在角色攻击时如何在动画的每一帧期间手动移动多边形。目前我正在使用一个“GameRenderer”类来处理“渲染”方法,并根据游戏中发生的事情将正确的帧绘制到屏幕上,就像这样......

public void render() {
    //draw the world and such here.
    batcher.begin(); //batcher is a SpriteBatcher
    Animation<TextureRegion> ani;
    if(character.isAttacking()) {
       ani = AssetLoader.playerAnimations.get("attack");
       batcher.draw(ani.getKeyFrame(character.getRunTime()), character.getX(), character.getY(), character.getWidth(), character.getHeight());

      if(ani.isAnimationFinished(character.getRunTime()) {
        character.setAttacking(false);
      }
    } else if(character.isMoving()) {
       ani = AssetLoader.playerAnimations.get("run");
       //draw running
    } else {
       ani = AssetLoader.playerAnimation.get("idle");
       //draw idle
    }
}

使用它,我不知道如何在攻击动画运行时更新多边形的位置,而不在当前动画帧上做某种切换语句,这似乎有点多,因为它必须得到框架,然后运行可能的帧并根据正在运行的帧编号更新多边形。并非不可能,只是似乎不是处理此类事情的最佳方式。所以我想也许在攻击动画的最后,我只是让他的身体的矩形包括剑的全部大小,然后检查碰撞?

如果需要,可以在字符类中创建矩形和多边形,如此......

class Character {
  //all the variables needed
  public final int CHARACTER_HEIGHT = 76;
  public final int CHARACTER_WIDTH = 74; //all measurements are half of sprite size
  //rest of the variables

  public Character(int x, int y, int width, int height) {
    this.width = width;
    this.height = height;
    this.centerX = (width / 2);
    this.centerY = (height / 2);
    this.bodyX = Math.round((x + centerX) - (CHARACTER_WIDTH / 2));
    this.bodyY = Math.round((y + centerY) - (CHARACTER_HEIGHT / 2) - 14);
    position = new Vector2(x, y);
    characterBody = new Rectangle();
    sword = new Polygon(new float[] {0, 0, 12, 0, 12, 50, 0, 50});
    sword.setOrigin(30, 50);
    sword.setRotation(-78f);
  }

  public void update(float delta) {
    runTime += delta;
    characterBody.set(bodyX, bodyY, CHARACTER_WIDTH, CHARACTER_HEIGHT);
    sword.setPosition(bodyX + 5, (bodyY - CHARACTER_HEIGTH + 18));
    position.add(velocity.cpy().scl(delta);
  }

  //getters and setters for characterbody, sword, isAttacking, etc
}

希望这有助于我有意义。我非常乐意提供任何帮助解决这个问题的方法。我真的迷失了,并试图找到最好的解决方案来处理如何检测与剑的碰撞,如果我应该尝试在攻击动画的每一帧更新剑多边形的位置和旋转,然后检查碰撞,或者如果我只是扩展作为人物身体的矩形,在它摆动时包括剑,并检查与之相撞。

谢谢,我为代码的混乱和可怕的描述道歉。

1 个答案:

答案 0 :(得分:1)

据我所知,这是一款2D游戏......

可行的一种方式:

  1. 找出玩家与敌人之间的距离。

  2. 如果距离小于剑的挥杆范围,那么玩家就会击中敌人。

  3. 您还必须考虑到玩家面临的方向等。

  4. 另一种选择是使用Box2D并将力施加到一个关节上的多边形集合,看它是否会碰到某些东西,但这是另一个答案。