当前位置: 首页 > 知识库问答 >
问题:

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

龚凯泽
2023-03-14

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

这真的很难解释,我希望它有道理。老实说,我甚至不知道当角色攻击时,如何在动画的每一帧中手动移动多边形。目前我正在使用一个“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
    }
}

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

如果你需要它,矩形和多边形是在字符类中创建的,如下所示....

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个答案

牛迪
2023-03-14

据我所知,这是一个2D游戏。。。

一种可行的方法

>

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

    如果距离小于剑的摆动范围,那么玩家就击中了敌人。

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

    另一种选择是使用Box2D,对关节上的多边形集即剑施加力,看看它是否击中了什么东西,但这是一个完全不同的答案。

  •  类似资料:
    • 问题内容: 这是我在游戏开发中的首次尝试。我刚刚开始尝试libgdx,并了解了游戏编程的不同方面。我查看了示例项目,我可以了解libgdx游戏的整体架构。但是为了掌握游戏动力学的基础知识,我开始玩一些低级的东西,例如如何绘制简单的形状,如何移动它们,如何处理类似的碰撞。 所以我打算写一个死人的简单android游戏(肯定不是一个游戏)。这是主意 最初,我想到要尝试libgdx舞台和演员概念,但排除

    • 在React中处理滚动位置的正确方法是什么?我真的很喜欢平滑滚动,因为更好的用户体验。因为在React中操作DOM是一个反模式,所以我遇到了一个问题:如何平滑地滚动到某个位置/元素?我通常会更改元素的scrollTop值,但这是对DOM的操作,这是不允许的。 杰斯宾 代码: 如何以反应的方式实现这一点?

    • 我在Java和Slick2D方面有几年的经验,我正试图将一个游戏移植到libgdx,因为它是一个更好的库。然而,我有一个简单的问题在屏幕上移动精灵。这个应用编程接口一定有一些我不理解的范例。我将我的代码提炼成以下内容。它识别输入,并在我的整个实体和网络系统中运行它,无论是在服务器上还是从服务器上,但是精灵保持在同一个位置。任何帮助都会很棒。 我的create()方法: getCurrentX/Y方

    • 这是我第一次尝试游戏开发。我刚开始尝试libgdx,了解游戏编程的不同方面。我看了示例项目,我可以理解libgdx游戏的整体架构。但是为了掌握游戏动力学的基础知识,我开始玩一些低级的东西,比如如何画简单的形状,如何移动它们,如何处理这样的碰撞。 所以我计划写一个死的简单Android游戏(它甚至不是一个游戏肯定)。这就是我们的想法 最初我想去试试libgdx stage } 但是我无法从坠落的物体

    • 我很想知道在x86架构上实现大容量内存拷贝的最佳方法。我意识到这取决于机器的特定特性。主要目标是过去4-5年制造的典型台式机。 我知道在过去,带有REPE的MOVSD名义上是最快的方法,因为您可以一次移动4个字节,但我读到现在MOVSB同样快速且编写更简单,所以您不妨进行字节移动,忘记4字节移动的复杂性。 一个围绕的问题是MOVxx指令是否值得。如果CPU的运行速度比内存总线快得多,那么使用CIS

    • 问题内容: 我必须在php中解析大型XML文件,其中之一是6.5 MB,它们甚至可能更大。如我所读,SimpleXML扩展将整个文件加载到一个对象中,这可能不是很有效。以您的经验,最好的方法是什么? 问题答案: 对于大文件,您将要使用SAX解析器而不是DOM解析器。 使用DOM解析器,它将读取整个文件并将其加载到内存中的对象树中。使用SAX解析器,它将顺序读取文件并调用用户定义的回调函数来处理数据