所以我有一个角色,我做了一个矩形来覆盖他的身体与敌人相交,所以当他与敌人相交时,他会受伤。我遇到的问题是,他有一把剑,剑在他身后有一个角度,因为他随身携带,当玩家攻击时,播放动画,剑挥动,越过他的头顶,打在他面前。我有一个多边形,可以在空闲/运行位置勾勒出剑的轮廓,但我无法弄清楚是否值得尝试在攻击动画的每一帧中手动移动多边形,然后检查动画每一帧的重叠凸多边形以查看剑是否击中了敌人,或者我是否应该将覆盖身体的矩形变宽以容纳最后的剑的动画,并检查它是否与敌人相交,然后如果它与敌人相交并且角色正在攻击,则敌人受伤而不是角色。
这真的很难解释,我希望这是有道理的。老实说,我什至不确定当角色攻击时,如何在动画的每一帧中手动移动多边形。目前我正在使用一个"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
}
}
使用它,我不确定如何在攻击动画运行时更新多边形的位置,而无需对当前动画帧执行某种 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
}
希望这有所帮助,我说得有道理。我非常乐意提供任何需要帮助解决这个问题的东西。我真的很迷茫,并试图找到最佳解决方案来处理如何检测与剑的碰撞,以及我是否应该尝试在攻击动画的每一帧更新剑多边形的位置和旋转,然后检查碰撞,或者我是否应该只是扩展作为角色主体的矩形以在挥舞剑时包括剑并检查与之的碰撞。
谢谢,对于混乱的代码和糟糕的描述,我深表歉意。
据我所知,这是一款 2D 游戏......
一种可能有效的方法:
-
找到玩家和敌人之间的距离。
-
如果距离小于剑的挥舞范围,则玩家已经击中了敌人。
-
您还必须考虑玩家面对的方向等。
另一种选择是使用 Box2D 并将力施加到多边形集(即剑)上,在关节上,看看它是否击中了什么东西,但这是完全不同的答案。