首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >坦克游戏运动

坦克游戏运动
EN

Stack Overflow用户
提问于 2015-04-18 03:52:47
回答 2查看 1K关注 0票数 3

我正在制作一款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球员的坦克。谢谢你的帮助!

代码语言:javascript
复制
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;
  }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-04-18 14:40:43

下面的代码有点恶心,但是应该做您想做的事情。在当前代码中,敌人在第一帧的X方向移动一个像素,然后在下一个帧的Y方向移动一个像素,这使得移动看起来是对角的。下面的代码为敌方坦克设置了一个短期目标点,使其在MOVE_BLOCK定义的一定距离内,朝X或Y方向前进。敌人会移动,直到它通过目标点,然后重新计算它应该移动的方向。请注意,每次创建新框架时都会调用enemyMove,因此可能每秒调用60次。

代码语言:javascript
复制
// 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);
}
票数 1
EN

Stack Overflow用户

发布于 2015-04-18 07:05:20

你可以使用曼哈顿的距离,找到中间位置,然后向两个方向移动坦克。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29712681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档