【问题标题】:2D projectile movement from coordinate pair来自坐标对的 2D 弹丸运动
【发布时间】:2015-10-11 17:54:10
【问题描述】:

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

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

实体创建

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 类中调用每个刻度,而不是在世界刻度中发生。

【问题讨论】:

  • 应该有-吗?在 ent.getDirection 旁边;?除了极化你试图摆脱的答案之外,它似乎没有做任何事情。
  • 我用来将斜率从 0 更改为 1,而 -direction 是我可以让它在我的设置测试中正常工作的唯一方法。
  • 我看到斜坡是的。你能告诉我更多关于你的问题吗?
  • 我注意到你从不改变方向。你知道setDirection() 甚至没有被使用吗?

标签: java 2d lwjgl motion projectile


【解决方案1】:

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

vx = objectX - mouseX
vy = objectY - mouseY

但是您可能希望将对象移动得比 bam there 慢一点,因此您需要将矢量缩放到所需的长度(等于每个游戏节拍的速度)。向量的当前长度是通过pythagorean 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),编码要移动到的方向。

当您将向量分量作为增量应用到其位置(这只是向量加法)时,缩放向量的长度会调整对象移动的速度。我最初交换了除法长度/目标长度(现在已修复),因此速度变量具有相反的含义(更大 = 更慢而不是更大 = 更快)。

【讨论】:

  • 哦,嗯,这似乎并不完全有效,因为结果一直给我无穷大。我在这里计算它(查看 NEW-CALC on question)(注意鼠标位置预先保存到对象中。)
  • 您能否详细解释一下目标长度与速度的关系?在我看来,我无法改变我必须改变的射弹 x 值。就这一点而言,我觉得你遗漏了很多信息。
  • @Cyphereion 我认为我并不过分简短,但这自然取决于个人背景以及学校数学有多少卡住。请参阅我的编辑以获取参考。
  • 它似乎只想在第一次运行它时更改值,而每隔一次它只是坐在那里看起来很漂亮。你可以在这里看到结果,我运行了 50K 次迭代,只有前 2 次左右实际上发生了变化。 link
  • 编辑:我还注意到当我保存因子(我假设它永远不会改变)时,我得到了一些非常奇怪的结果。 link
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2019-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多