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条件は基本的に、float値を比較するための単純な方法であるため、十分に近づくと停止します。これにより、正確な値に到達できない可能性があるため、ターゲット位置をオーバーシュートして前後にバウンドするのを防ぐことができます。
  • ロードしたテクスチャの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 に答える