Java 在libGDX中处理动画中剑移动的最佳方法
所以我有一个角色,我做了一个长方形来覆盖他的身体,以便与敌人相交,这样他在与敌人相交时会受伤。我遇到的问题是,他有一把剑,剑在他身后成一个角度,因为他随身携带着剑,当玩家攻击时,会播放动画,剑会在他头上摆动,并在他面前击落。我有一个多边形,它在空闲/奔跑位置勾勒出剑的轮廓,但我不知道在攻击动画的每一帧中尝试手动移动多边形是否值得,然后在动画的每一帧中检查重叠多边形,以查看剑是否击中敌人,或者,如果我只是将覆盖身体的矩形变宽,以便在动画结束时容纳剑,并检查它是否与敌人相交,那么如果它与敌人相交,并且角色正在攻击,则敌人受到伤害,而不是角色 这真的很难解释,我希望这是有道理的。老实说,我甚至不知道当角色攻击时,如何在动画的每一帧中手动移动多边形。目前,我正在使用一个“GameRenderer”类来处理“render”方法,并根据游戏中发生的事情将正确的帧绘制到屏幕上,类似这样的Java 在libGDX中处理动画中剑移动的最佳方法,java,animation,libgdx,Java,Animation,Libgdx,所以我有一个角色,我做了一个长方形来覆盖他的身体,以便与敌人相交,这样他在与敌人相交时会受伤。我遇到的问题是,他有一把剑,剑在他身后成一个角度,因为他随身携带着剑,当玩家攻击时,会播放动画,剑会在他头上摆动,并在他面前击落。我有一个多边形,它在空闲/奔跑位置勾勒出剑的轮廓,但我不知道在攻击动画的每一帧中尝试手动移动多边形是否值得,然后在动画的每一帧中检查重叠多边形,以查看剑是否击中敌人,或者,如果我只是将覆盖身体的矩形变宽,以便在动画结束时容纳剑,并检查它是否与敌人相交,那么如果它与敌人相交,并
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
}
}
希望这能有所帮助,我也有道理。我非常乐意提供一切必要的帮助。我真的迷路了,正在寻找处理如何检测与剑的碰撞的最佳解决方案,如果我应该尝试在攻击动画的每一帧更新剑多边形的位置和旋转,然后检查碰撞,或者,如果我只是扩展角色身体的矩形,当它摆动时包括剑,并检查与剑的碰撞
谢谢,我为混乱的代码和糟糕的描述道歉 据我所知,这是一个2D游戏 一种可能有效的方法是:
另一种选择是使用Box2D,对关节上的剑多边形集施加力,看看它是否击中了什么东西,但这是另一个答案。我确实这样做了,看起来很不错。我只是创建一个2d数组,每个帧的角度为x,y。(共10帧)及其与char sprite的分离。看一看,用重叠矩形检查碰撞很容易(而且很便宜)。不需要复杂的多边形碰撞检查。
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
}