我正在制作像tank
这样的Atari tank game
游戏,但我遇到了一些麻烦。我正在尝试制作enemy's tank move towards the player's tank
但can't move diagonally
,因为播放器也不允许这样做。然而,我实现它的方式,当x和y轴的距离彼此相等时,它是对角线。有没有办法可以让它在改变方向后被迫向一个方向移动一段时间?它的方式是compare its x and y values
与玩家的坦克(正在传入的坦克),如果x-component is bigger than y
并且它是right or left
上的四个案例,如果y-component is bigger than x
并且是above or below
玩家的坦克。谢谢你的帮助!
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;
}
答案 0 :(得分:2)
您可以使用曼哈顿距离并找到中位数,然后向两个方向移动坦克。
答案 1 :(得分: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);
}