LibGdx - 朝另一个方向移动 Sprite

LibGdx - Move Sprite in the direction of another

我是 LibGdx 的新手,我还在学习中。我正在做一个小游戏项目来学习这个不错的框架。但是,我的游戏存在一些问题。我的游戏是自上而下的射击游戏。有一个人类角色(space 海军陆战队员)必须射杀一个外星人,外星人会一直朝他的方向移动,直到它死去。我的代码没有任何子弹 yet.I 能够让射手向光标方向旋转,外星人也向射手方向旋转,但我不能让外星人移动他的方向。我很确定我这样做的方法是完全错误的。我已经尝试了很多方法来修复它,但我无法修复它!谢谢你们的关注! 您可以在此处找到主要 class 的完整代码: https://github.com/Igor-Lopes/LibGdx/blob/master/Splash.java#L125

public void moveAlien() {
    float mX = 0;
    float mY = 0;
    int velocity = 50;
    vAlien = new Vector2(-1 * (float) Math.sin(Alienbody.getAngle()) * velocity,
            (float) Math.cos(Alienbody.getAngle() * velocity));

    mX = (float) Math.cos(Math.toRadians(spacemarine.getRotation()));
    mY = (float) Math.sin(Math.toRadians(spacemarine.getRotation()));

    vAlien.x = mX;
    vAlien.y = mY;
    if (vAlien.len() > 0) {
        vAlien = vAlien.nor();
    }
    vAlien.x = vAlien.x * velocity;
    vAlien.y = vAlien.y * velocity;
    vAlien.x += vAlien.x * Gdx.graphics.getDeltaTime();
    vAlien.y += vAlien.x * Gdx.graphics.getDeltaTime();
}

public float rotateMarine() {
    float angle = 0;
    float mouseX = 0;
    float mouseY = 0;
    mouseX = Gdx.input.getX();
    mouseY = 677 - Gdx.input.getY();
    angle = (float) Math.toDegrees(Math.atan2(mouseX - spacemarine.getX(),
            mouseY - spacemarine.getY()));
    if (angle < 0)
        angle += 360;
    spacemarine.setRotation(angle * -1);
    return angle;
}

public float rotateAlien(Sprite s, float posX, float posY) {
    float angle = 0;
    float mouseX = 0;
    float mouseY = 0;
    mouseX = posX;
    mouseY = posY;
    angle = (float) Math.toDegrees(Math.atan2(mouseX - s.getX(), mouseY - s.getY()));
    if (angle < 0)
        angle += 360;
    s.setRotation(angle * -1);
    return angle;
}

@Override
public void render(float delta) {
    float angle;
    moveAlien();
    Gdx.gl.glClearColor(0, 0, 0, 1);
    Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
    world.step(Gdx.graphics.getDeltaTime(), 6, 2);
    angle = rotateMarine();
    rotateAlien(alien, spacemarine.getX(),
            spacemarine.getY());
    if (Gdx.input.isKeyPressed(Input.Keys.W) == true
            && spacemarine.getY() < 560) {
        Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() + 4,
                angle);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.S) == true
            && spacemarine.getY() > 0) {
        Marinebody.setTransform(spacemarine.getX(), spacemarine.getY() - 4,
                angle);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.D) == true
            && spacemarine.getX() < 920) {
        Marinebody.setTransform(spacemarine.getX() + 4, spacemarine.getY(),
                angle);
    }
    if (Gdx.input.isKeyPressed(Input.Keys.A) == true
            & spacemarine.getX() > 8) {
        Marinebody.setTransform(spacemarine.getX() - 4, spacemarine.getY(),
                angle);
    }
    alien.setPosition(Alienbody.getPosition().x, Alienbody.getPosition().y);
    spacemarine.setPosition(Marinebody.getPosition().x, Marinebody.getPosition().y);
    batch.begin();
    spacemarine.draw(batch);
    alien.draw(batch);
    batch.end();
    // stage.act();
    // stage.draw();
}

我还没有足够的声望点数来添加 "comment",我不确定这是否是你的问题,但一个明确的错误是 "Y += X" 在你的 moveAlien方法就行了:vAlien.y += vAlien.x * Gdx.graphics.getDeltaTime();

我有一段时间的解决方案,但我忘记了 post。这是将敌人列表移向玩家的方法。

public void moveAlien() {

    for (Aliens a : aliens) { //List of Aliens (Enemy)
        Sprite s = a.getSprite(); //Get current enemy's sprite
        float targetX = spacemarine.getX(); //Player's X
        float targetY = spacemarine.getY(); //Player's Y
        float spriteX = s.getX(); //Enemy's X
        float spriteY = s.getY(); //Enemy's Y
        float x2 = s.getX(); //Enemy's new X
        float y2 = s.getY(); //Enemy's new Y
        float angle; // We use a triangle to calculate the new trajectory
            angle = (float) Math
                    .atan2(targetY - spriteY, targetX - spriteX);
            x2 += (float) Math.cos(angle) * 125
                    * Gdx.graphics.getDeltaTime();
            y2 += (float) Math.sin(angle) * 125
                    * Gdx.graphics.getDeltaTime();
            s.setPosition(x2, y2); //Set enemy's new positions.
        }
}