坦克游戏移动

3
我正在制作一个类似于Atari坦克游戏的坦克游戏,但遇到了一些麻烦。我试图让敌方坦克向玩家的坦克移动,但由于玩家不允许对角线移动,因此它无法对角线移动。然而,我实现的方式是,当x和y轴之间的距离相等时,它会对角线移动。有没有办法使它在改变方向后强制朝一个方向移动一段时间?我的做法是将其x和y值与玩家的坦克(传入的坦克)进行比较,四种情况分别为:x分量大于y并且在右侧或左侧,y分量大于x并且在玩家坦克的上方或下方。感谢您的帮助!
public void enemyMove(Tank t) {
    if ( Math.abs(getX() - t.getX()) >= Math.abs(getY() - t.getY()) && getX() > t.getX() )
      goLeft();
    else if ( Math.abs(getX() - t.getX()) > Math.abs(getY() - t.getY()) && getX() < t.getX() )
      goRight();
    else if ( Math.abs(getX() - t.getX()) <= Math.abs(getY() - t.getY()) && getY() > t.getY() )
      goUp();
    else if ( Math.abs(getX() - t.getX()) < Math.abs(getY() - t.getY()) && getY() < t.getY() )
      goDown();

    setX(getX() + dx);
    setY(getY() + dy);
  }

public void goUp() {
    dx = 0;
    dy = -1;
  }

public void goDown() {
    dx = 0;
    dy = 1;
  }

public void goLeft() {
    dx = -1;
    dy = 0;
  }

public void goRight() {
    dx = 1;
    dy = 0;
  }

我不确定,也许你需要使用sleep或timer来暂停游戏几个tick。也许坦克向左移动,然后立即向下移动,以便于人类看起来是斜线移动。 - tim
是的,我知道正在发生这种情况,所以我想防止它发生。我想让它这样做,比如说,如果我向左走,它会在改变方向之前向左走一段时间。如果暂停游戏,那么它也会影响玩家,使游戏看起来很卡顿吗? - Ccyan
不是说要暂停游戏。使用内置的Java计时器,并将其设置为每秒40个刻度。然后,玩家和坦克将每3个刻度或其他一些时间移动一次。以这种速率,人眼将能够非常容易地处理运动。 - tim
如果距离相等,则随机选择一个方向或选择任意值。 - MadProgrammer
2个回答

2
您可以使用曼哈顿距离来找到中位数,然后向两个方向移动坦克。

1
以下代码看起来有点乱,但应该能够达到您的要求。在您当前的代码中,敌人在第一帧向X方向移动一个像素,然后在下一帧向Y方向移动一个像素,这使得移动看起来是对角线的。下面的代码为敌方坦克设置了一个短期的目标点,以X或Y方向前进一定距离(MOVE_BLOCK定义),敌人将移动直到超过该目标点,然后重新计算应该移动的方向。请注意,enemyMove将在每次创建新帧时调用,因此可能每秒钟会调用60次。
// The tank will move this distance in x or y before changing directions
private final int MOVE_BLOCK = 120;
// The short-term target of the enemy tank
Point target = null;
public void enemyMove(Tank t) {
    /* true if enemy is moving left and enemy is already left of target point, 
     * or moving right and right of target... */
    boolean passedTarget = target == null || 
        (dx < 0 && getX() < target.getX()) ||
        (dx > 0 && getX() > target.getX()) ||
        (dy < 0 && getY() < target.getY()) ||
        (dy > 0 && getY() > target.getY());
    // Calculate a new target point if the old target was passed
    if(passedTarget) {
        int xDist = Math.abs(getX() - t.getX());
        int yDist = Math.abs(getY() - t.getY());
        if ( xDist > yDist ) {
            // Cover the remaining distance when close to the target
            int moveLength = xDist < MOVE_BLOCK ? xDist : MOVE_BLOCK;
            if( getX() >= t.getX() )
                goLeft();
                target = new Point(getX() - moveLength, getY());
            else
                goRight();
                target = new Point(getX() + moveLength, getY());
        } else {
            int moveLength = yDist < MOVE_BLOCK ? yDist : MOVE_BLOCK;
            if ( getY() >= t.getY() ) {
                goUp();
                target = new Point(getX(), getY() - moveLength);
            } else {
                goDown();
                target = new Point(getX(), getY() + moveLength);
            }
        }
    }

    setX(getX() + dx);
    setY(getY() + dy);
}

感谢您提供的代码,我只是在寻求建议,但这太棒了! - Ccyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接