Java 坦克游戏动作

Java 坦克游戏动作,java,graphics,Java,Graphics,我正在做一个类似雅达利坦克游戏的坦克游戏,我遇到了一些麻烦。我试图让敌人的坦克朝玩家的坦克移动,但是它不能斜向移动,因为玩家也不允许这样做。但是,按照我的实现方式,当距离x轴和y轴的距离相等时,它呈对角线移动。有没有办法让它在改变方向后被迫朝一个方向移动一段时间?这样做的方式是,它将将其x和y值与玩家的坦克(正在传入的坦克)进行比较,这四种情况用于x分量是否大于y,是否位于右侧或左侧,如果y分量大于x,并且在玩家的坦克上方还是下方。谢谢你的帮助 public void enemyMove(Tan

我正在做一个类似雅达利坦克游戏的
坦克游戏
,我遇到了一些麻烦。我试图让敌人的坦克朝玩家的坦克移动,但是它不能斜向移动,因为玩家也不允许这样做。但是,按照我的实现方式,当距离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;
  }
public void enemyMove(t罐){
if(Math.abs(getX()-t.getX())>=Math.abs(getY()-t.getY())&&getX()>t.getX())
高尔夫();
else if(Math.abs(getX()-t.getX())>Math.abs(getY()-t.getY())和&getX()
您可以使用曼哈顿距离,找到中间带,然后将油箱向两个方向移动。

下面的代码有点粗糙,但应该按照您的要求执行。在您当前的代码中,敌人在第一帧中沿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);
}
//在改变方向之前,油箱将在x或y方向上移动此距离
私有最终整数移动块=120;
//敌人坦克的短期目标
点目标=空;
公共垃圾填埋场(t罐){
/*如果敌人向左移动且敌人已离开目标点,则为true,
*或者在目标的右边移动*/
布尔值passedTarget=target==null | |
(dx<0&&getX()0&&getX()>target.getX())||
(dy<0&&getY()0&&getY()>target.getY());
//如果通过旧目标,则计算新目标点
如果(已通过目标){
int xDist=Math.abs(getX()-t.getX());
int yDist=Math.abs(getY()-t.getY());
如果(xDist>yDist){
//接近目标时,覆盖剩余距离
int moveLength=xDist=t.getX())
高尔夫();
目标=新点(getX()-moveLength,getY());
其他的
戈赖特();
目标=新点(getX()+moveLength,getY());
}否则{
int moveLength=yDist=t.getY()){
goUp();
目标=新点(getX(),getY()-moveLength);
}否则{
货仓();
目标=新点(getX(),getY()+移动长度);
}
}
}
setX(getX()+dx);
setY(getY()+dy);
}

我不确定,也许你需要使用睡眠或计时器暂停游戏几秒钟。也许坦克向左移动,然后紧接着向下移动,这样对人类来说它看起来是对角的。是的,我知道这就是发生的事情,所以我想阻止它发生。我想让它,比如说,如果我向左走,它会向左走一段时间,然后再转向另一个方向。如果你暂停游戏,会不会影响玩家,让游戏看起来很滞后?不要说暂停游戏。使用内置的java计时器,并将其设置为每秒40次。然后,玩家和坦克将每3次移动一次。在这个速度下,人眼将能够非常容易地处理运动。如果距离相等,要么随机选择方向,要么选择任意值感谢代码,我只是想征求建议,但这太棒了!