雪碧运动不正常。 libgdx

时间:2013-03-18 00:17:31

标签: java libgdx sprite orthographic

我是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;
        }
    }

}

}

1 个答案:

答案 0 :(得分:2)

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

  • 正交相机,当您设置相机时0,0是屏幕的中心。宽度和高度是您在构造函数中指定的宽度和高度。所以顶边是x,160,底边是x,-160。左边缘为-240,y,右边缘为240,y。
  • drawD()请注意,我正在图像中间绘制精灵,但它没有移动。我改为以相反的方向移动地图(y反转)。
  • updateInput()注意我传入一个delta值(这是帧之间的秒数),这样可以平滑地移动东西。速度为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;
            }
        }
    }
}