【问题标题】:Best way to handle sword moving in animation in libGDX在 libGDX 中处理动画中剑移动的最佳方法
【发布时间】:2018-09-26 15:38:15
【问题描述】:

所以我有一个角色,我做了一个矩形来覆盖他的身体,以便与敌人相交,这样他在与敌人相交时会受到伤害。我遇到的问题是,他有一把剑,剑在他身后有一个角度,因为他随身携带,当玩家攻击时,播放动画并且剑摆动,在他的头上并击中在他面前。我有一个多边形在空闲/运行位置勾勒出剑的轮廓,但我不知道在攻击动画的每一帧期间尝试手动移动多边形是否值得,然后通过每一帧检查overlapConvexPolygons动画看看剑是否击中了敌人,或者我是否应该在动画结束时让覆盖身体的矩形更宽以容纳剑,并检查它是否与敌人相交,然后如果它确实并且角色正在攻击,敌人受伤而不是角色。

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

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
    }
}

使用它,我不确定如何在攻击动画运行时更新多边形的位置,而无需在当前动画帧上执行某种 switch 语句,这似乎有点多,因为它必须得到帧,然后遍历可能的帧并根据正在运行的帧号更新多边形。并非不可能,只是似乎不是处理这类事情的最佳方式。所以我在想也许在攻击动画的最后,我只是让他身体的矩形变成包括剑在内的精灵的全尺寸,然后检查碰撞?

如果你需要它,矩形和多边形会像这样在字符类中创建......

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
}

希望这会有所帮助,而且我说得通。我非常乐意提供帮助解决此问题所需的任何东西。我真的很迷茫,试图找到最好的解决方案来处理如何检测与剑的碰撞,如果我应该尝试在攻击动画的每一帧更新剑多边形的位置和旋转,然后检查碰撞,或者我是否应该扩展作为角色身体的矩形以在挥动剑时包含剑并检查与它的碰撞。

谢谢,对于混乱的代码和糟糕的描述,我深表歉意。

【问题讨论】:

  • 我确实做到了,而且看起来不错。我只是为每一帧创建一个带有角度、x、y 的二维数组。 (总共 10 帧)及其与字符精灵分离。看看youtube.com/watch?v=7kvAFtnwphI
  • 用重叠矩形检查碰撞很容易(而且便宜)。不需要复杂的多边形碰撞检查。

标签: java animation libgdx


【解决方案1】:

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

一种可行的方法:

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

  2. 如果距离小于剑的挥动范围,则玩家击中了敌人。

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

另一种选择是使用 Box2D 并将力施加到作为剑的多边形集上,在关节上查看它是否击中某物,但这是另一个答案。

【讨论】:

    猜你喜欢
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-12
    • 2014-02-27
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多