LibGdx - 将Sprite移向另一个方向

时间:2015-03-12 05:53:32

标签: java libgdx sprite direction jbox2d

我对LibGdx很陌生,我还在学习。我正在开发一个小游戏项目来学习这个漂亮的框架。但是,我的游戏存在一些问题。我的游戏是一个自上而下的射击游戏。有一个人类角色(太空海洋)必须射击一个外星人,它将一直向他的方向移动,直到它死亡。我的代码还没有任何子弹。我能够让射手向光标方向旋转,外星人也会朝着射手的方向旋转,但是我不能让外星人向他的方向移动。我很确定我的方法是完全错误的。我已经尝试了很多修复它,但我无法修复它!我感谢你的关注! 您可以在此处找到主类的完整代码:  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();
}

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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.
        }
}