坐标对中的2D射弹运动

时间:2015-10-11 17:54:11

标签: java 2d lwjgl motion projectile

所以我试图按照屏幕上鼠标位置指示的方向移动射弹。我已经将鼠标坐标转换为游戏中的坐标但是我无法弄清楚如何正确地将射弹移动到正确的方向。我试图用一个斜坡来移动抛射物,但它似乎并不想抓住正确的坡度,所以我最终将它们朝完全错误的方向飞行。以下是我正在使用的一些代码。 对此有任何帮助将非常感激,因为我在这方面有点过头了。

注意:射弹不跟随鼠标。它应该保存坐标,然后朝那个方向前进,注意它也可以以相同的速率越过给定的坐标。

实体创作

int[] mousePos = MouseManager.getCalculatedMouseCoordinates();
                float deltaX = mousePos[0] - GameManager.x;
                float deltaY = mousePos[1] - GameManager.y;
                float m = deltaY/deltaX;
                System.out.println(m);
                GameManager.currentWorld.addEntity(new EntityProjectile(GameManager.x, GameManager.y, 30, m, 50, "fireball"));

弹丸等级

    package UnNamedRpg.Player.Entity;

public class EntityProjectile {

    private double x, y;
    private int entityID = -1;
    private int speed;
    private double headerX, headerY;
    private int renderHeading;
    private double range, currentRange = 0;
    private String texture;
    private double factor = -1;
    public EntityProjectile(double startX, double startY, int speed, double headerX, double headerY, double range, String texture){
        setX(startX);
        setY(startY);
        setSpeed(speed);
        setHeaderX(headerX);
        setHeaderY(headerY);
        setTexture(texture);
        setRange(range);
    }

    public void doTick(){
        double vx = this.x - this.headerX;
        double vy = this.y - this.headerY;
        if(this.factor == -1){
            double length = Math.sqrt((vx*vx) + (vy*vy));
            double factor = this.speed / length;
            this.factor = factor;
        }
        vx *= factor;
        vy *= factor;
        this.x = vx;
        this.y = vy;
    }

    public int getSpeed() {
        return speed;
    }

    public void setSpeed(int speed) {
        this.speed = speed;
    }

    public int getRenderHeading() {
        return renderHeading;
    }

    public void setRenderHeading(int renderHeading) {
        this.renderHeading = renderHeading;
    }

    public int getEntityID() {
        return entityID;
    }

    public void setEntityID(int entityID) {
        this.entityID = entityID;
    }

    public double getX() {
        return x;
    }

    public void setX(double x) {
        this.x = x;
    }

    public double getY() {
        return y;
    }

    public void setY(double y) {
        this.y = y;
    }

    public String getTexture() {
        return texture;
    }

    public void setTexture(String texture) {
        this.texture = texture;
    }

    public double getRange() {
        return range;
    }

    public void setRange(double range) {
        this.range = range;
    }

    public double getCurrentRange() {
        return currentRange;
    }

    public void setCurrentRange(double currentRange) {
        this.currentRange = currentRange;
    }

    public double getHeaderX() {
        return headerX;
    }

    public void setHeaderX(double headerX) {
        this.headerX = headerX;
    }

    public double getHeaderY() {
        return headerY;
    }

    public void setHeaderY(double headerY) {
        this.headerY = headerY;
    }

    public double getFactor() {
        return factor;
    }

    public void setFactor(double factor) {
        this.factor = factor;
    }
}

更新位置方法

- 现在在EntityProjectile类中调用每个tick而不是它在世界上发生的滴答。

2 个答案:

答案 0 :(得分:1)

通过一些基本的矢量数学,向一个给定点移动相对简单。您想要移动的矢量仅通过坐标减法计算:

vx = objectX - mouseX
vy = objectY - mouseY

但是你可能想要移动你的对象比那里的 bam慢一点,所以你需要将矢量缩放到所需的长度(等于每场比赛的速度)。矢量的当前长度由毕达哥拉斯sqrt(a * a + b * b)获得。要将向量缩放到给定长度,只需将组件乘以所需因子:

double targetLength = 5.0; // chosen arbitrarily
double length = Math.sqrt(vx * vx + vy * vy);
double factor = targetLength / length;
vx *= factor;
vy *= factor;

你有速度分量x,y用作每场比赛的增量值。 5.0是"速度"每个刻度对象移动的位置。

编辑:@Cyphereion关于向量的长度,几何上讲三角形的基础,请参阅https://en.wikipedia.org/wiki/Pythagorean_theorem(被认为是常见的知识)。

一旦你有了这个,你只需要通过计算出一个缩放因子来调整每个组件的长度,这个缩放因子使基线成为所需的速度"长度。组件的原始值(vx,vy)表示向量(请参阅:https://en.wikipedia.org/wiki/Euclidean_vector#Representations)编码要移动的方向。

缩放矢量的长度会调整对象移动时的速度,将向量分量应用为delta到其位置(这只是向量加法)。我交换了分区长度/ targetLength initailly(现在已修复),因此速度变量具有相反的含义(较大=较慢而不是较大=较快)。

答案 1 :(得分:0)

如果你的精灵有问题,那么使用你在那里的setDirection()来增加轨迹。在这些示例中,您拥有所有良好的代码,但是当您的鼠标改变方向时,您将缺少重新定向的方法。这就是我能看到的一切。祝你好运!