塔防:子弹数学

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了塔防:子弹数学相关的知识,希望对你有一定的参考价值。

我正在使用Slick2D库在Java中制作塔防游戏。一个问题是我的子弹数学。现在,子弹将在敌人当前的X,Y坐标后射击 - 但是当敌人在子弹到达X时移动,Y将会落后。除了加速子弹外,还有什么想法解决这个问题吗?子弹数学在子弹类的底部。

public class Bullets implements GameObject {
private ArrayList<Bullet> bulletList = new ArrayList<Bullet>();
Enemy enemy = new Enemy();
BasicTower basicTower = new BasicTower();
public Shape bulletCircle = null;
public boolean collides = false;
public int bulletCount;

public Bullets() throws SlickException {
}


@Override
public Vector2f getPosition() {
    return null;
}

@Override
public void init(GameContainer gc, StateBasedGame stateBasedGame) throws SlickException {
}

@Override
public void render(GameContainer gc, StateBasedGame stateBasedGame, Graphics g) throws SlickException {
    for (int i = 0; i < bulletList.size(); i++) {
        Bullet bullet = bulletList.get(i);
        bulletCircle = new Circle(bullet.location.getX(),bullet.location.getY(),10);
        if (bulletCircle.intersects( enemy.playerRectangle )){
            bulletCount++;
            bulletList.remove( i );
            collides = true;
        }else{
            collides = false;
        }
        g.setColor( red );
        g.fill(bulletCircle);
    }


}

@Override
public void update(GameContainer gc, StateBasedGame stateBasedGame, int delta) throws SlickException {
    //Update the bullet's position.
    Input input = gc.getInput();
    //enemy.update(gc, stateBasedGame, delta);
    for (int i = 0; i < bulletList.size(); i++) {
        Bullet bullet = bulletList.get(i);
        bullet.move();
    }
}

public void addNewBullet2(float x1, float y1, float x2, float y2) {
    bulletList.add(new Bullet(x1*64+48,y1*64+48, x2, y2));
}


class Bullet {
    float startX = 0;
    float startY = 0;
    float destX = 0;
    float destY = 0;
    Point location = new Point(0, 0);
    float speed; //how fast this moves.
    float dx;
    float dy;


    public Bullet(float startX, float startY, float destX, float destY) {
        this.startX = startX;
        this.startY = startY;
        location.setLocation(startX, startY);
        this.destX = destX;
        this.destY = destY;
        recalculateVector(destX, destY);
    }

    public void recalculateVector(float destX, float destY) {
        float rad = (float) (Math.atan2(destX - startX, startY - destY));
        //Can set different speeds here, if you wanted.
        speed = 5;
        this.dx = (float) Math.sin(rad) * speed;
        this.dy = -(float) Math.cos(rad) * speed;
    }

    public void move() {
        float x = location.getX();
        float y = location.getY();
        x += dx;
        y += dy;
        location.setLocation(x, y);
    }
}
答案

这只是一个线性的albegra问题。你的目标是在你开始射击时敌人所在的点P0。但相反,当你的子弹到达时,你需要指出它们是什么时候。所以你需要敌人的速度,子弹速度和射手距离来获得正确点的坐标。

但是,由于数学可能变得棘手(例如,如果目标不跟随线),您可以尝试使子弹跟随目标,这当然会导致曲线轨迹。

另一答案

你可能需要考虑每个敌人的速度。因此,如果您拥有更快或更慢的敌人,您可以使用敌人速度调整子弹发送的位置。而不是仅仅将子弹发送给敌人X&Y,你可以根据他们的速度添加敌人X和Y.这将在敌人面前稍微发射子弹以补偿敌人的速度。

以上是关于塔防:子弹数学的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d-x 3.0游戏实例学习笔记《卡牌塔防》第十步---发射子弹&amp;怪物受伤---全部源代码和资源完结下载

塔防游戏 代码project as 分享

如何制作塔防游戏 代码,操作,说明——Unity 5.3.5f1

远古守卫/cocos2d-x 源代码/塔防游戏/高仿王国保卫战

Coco2d-x 塔防游戏“贼来了”之开发简档 之 三(完结)

《萌萌守卫塔防》隐私政策