0

我是 libgdx 的新手,我正在尝试在相机跟随时进行精灵移动。我可以让精灵完美地移动,直到我将相机连接到它。当我单击时,精灵会移动到任何感觉(看起来)的地方,并且相机会正确跟随。我尝试了一些不同的东西,但此时它只是猜测和检查。

public class MyGdxGame implements ApplicationListener {
OrthographicCamera mCamera;
SpriteBatch mBatch;
Texture mTexture, mMap;
Sprite sprite;
float touchX, touchY;
float spriteX, spriteY, speed = 5;

@Override
public void create() {
    float CAMERA_WIDTH = 480, CAMERA_HEIGHT = 320;

    mBatch = new SpriteBatch();
    mTexture = new Texture(Gdx.files.internal("data/logo.png"));
    mMap = new Texture(Gdx.files.internal("data/sc_map.png"));
    mCamera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);
    mCamera.setToOrtho(false, CAMERA_WIDTH, CAMERA_HEIGHT);
}

@Override
public void dispose() {

}

@Override
public void render() {
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

    mBatch.setProjectionMatrix(mCamera.combined);
    mCamera.update();
    mBatch.begin();
    updateInput();
    drawD();
    mBatch.end();

}

@Override
public void resize(int width, int height) {
}

@Override
public void pause() {
}

@Override
public void resume() {
}

public void drawD() {
    mCamera.position.set(spriteX, spriteY, 0);
    mBatch.draw(mMap, 0, 0);
    mBatch.draw(mTexture, spriteX, spriteY);

}

public void updateInput() {

    if (Gdx.input.justTouched()) {

        touchX = Gdx.input.getX();
        touchY = Gdx.input.getY();

    }
    if (touchX != spriteX) {

        if (spriteX < touchX) {
            spriteX += speed;
        }
        if (spriteX > touchX) {
            spriteX -= speed;
        }
    }
    if (touchY != spriteY) {
        if (spriteY > Gdx.graphics.getHeight() - touchY) {
            spriteY -= 10;
        }
        if (spriteY < Gdx.graphics.getHeight() - touchY) {
            spriteY += 10;
        }
    }

}

}

4

1 回答 1

2

由于您已经花费了相当多的时间并试图让它发挥作用,所以我会给您一点推动力,使其更接近您正在寻找的东西。查看我所做的更改,下面我将概述我所做的以帮助您更好地理解代码。

  • 正交相机,当您设置相机时,0,0 是屏幕的中心。宽度和高度是您在构造函数中指定的。所以顶边是 x, 160,底边是 x, -160。左边缘为 -240, y,右边缘为 240, y。
  • drawD() 请注意,我在图像中间绘制精灵并且它没有移动。相反,我将地图朝相反的方向移动(y 是倒置的)。
  • updateInput() 请注意,我传入了一个增量值(这是帧之间的时间,以秒为单位),这使您可以平滑地移动事物。速度为 120,因此这将以 120/秒的速度平稳移动您的角色。
  • if 条件基本上是比较浮点值的一种简单方法,因此当它足够接近时它会停止。这可以防止它过度射击目标位置然后来回弹跳,因为它可能无法达到准确的值。
  • 我为您加载的纹理添加了 dispose 调用,这些调用很重要,因为您不想填满内存。

我希望这可以帮助您开始并指出正确的方向。开发游戏需要大量工作并且需要时间,所以请耐心等待,并准备好在此过程中学到很多东西!

根据您的评论,我相信您正在寻找的是更接近此的东西:

public class MyGdxGame implements ApplicationListener {
    OrthographicCamera mCamera;
    SpriteBatch mBatch;
    Texture mTexture, mMap;
    float touchX, touchY;
    float spriteX, spriteY, speed = 120;

    final float CAMERA_WIDTH = 480, CAMERA_HEIGHT = 320;

    @Override public void create() {
        mCamera = new OrthographicCamera(CAMERA_WIDTH, CAMERA_HEIGHT);

        mBatch = new SpriteBatch();
        mTexture = new Texture(Gdx.files.internal("data/logo.png"));
        mMap = new Texture(Gdx.files.internal("data/sc_map.png"));
    }

    @Override public void dispose() {
        mTexture.dispose();
        mMap.dispose();
    }

    @Override public void render() {
        Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

        updateInput(Gdx.graphics.getDeltaTime());
        mCamera.update();
        mBatch.setProjectionMatrix(mCamera.combined);
        mBatch.begin();
        drawD();
        mBatch.end();
    }

    @Override public void resize(final int width, final int height) {}

    @Override public void pause() {}

    @Override public void resume() {}

    public void drawD() {
        mBatch.draw(mMap, -spriteX - (mMap.getWidth() / 2), spriteY - (mMap.getHeight() / 2));
        mBatch.draw(mTexture, -32, -32, 64, 64);
    }

    public void updateInput(final float delta) {
        if (Gdx.input.justTouched()) {
            touchX = Gdx.input.getX() - (Gdx.graphics.getWidth() / 2);
            touchY = Gdx.input.getY() - (Gdx.graphics.getHeight() / 2);
        }
        final float dv = delta * speed;
        if (Math.abs(touchX - spriteX) > 1) {
            if (spriteX < touchX) {
                spriteX += dv;
            }
            if (spriteX > touchX) {
                spriteX -= dv;
            }
        }
        if (Math.abs(touchY - spriteY) > 1) {
            if (spriteY > touchY) {
                spriteY -= dv;
            }
            if (spriteY < touchY) {
                spriteY += dv;
            }
        }
    }
}
于 2013-03-18T18:21:31.723 回答