Kamera dan Mesin Goyah

Saya telah mencoba menemukan cara terbaik untuk menggerakkan kamera dengan menyeret pemandangan latar belakang. Saya belum menemukan sumber daya apa pun untuk membantu. Saya cukup baru dalam pemrograman Android dan menggunakan andEngine.

Ini kode saya sejauh ini

public class MainActivity extends SimpleBaseGameActivity{

private static final int CAMERA_WIDTH = 800;
private static final int CAMERA_HEIGHT = 480;

private SmoothCamera mSmoothCamera;
private BitmapTextureAtlas mBitmapTextureAtlas;
private TextureRegion mFaceTextureRegion;
private Sprite face;
private float lastXmove;
private float lastYmove;


@Override
public EngineOptions onCreateEngineOptions() {

    mSmoothCamera = new SmoothCamera(0, 0, CAMERA_WIDTH-200, CAMERA_HEIGHT-200, 400, 400, 2);
    mSmoothCamera.setBounds(0f,0f,CAMERA_WIDTH, CAMERA_HEIGHT);
    cameraLastX = mSmoothCamera.getCenterX();
    cameraLastY = mSmoothCamera.getCenterY();
    return new EngineOptions(true, ScreenOrientation.LANDSCAPE_FIXED, new RatioResolutionPolicy(CAMERA_WIDTH, CAMERA_HEIGHT), mSmoothCamera);
}

@Override
public void onCreateResources() {
    this.mBitmapTextureAtlas = new BitmapTextureAtlas(this.getTextureManager(), 28, 247, TextureOptions.BILINEAR);
    this.mFaceTextureRegion = BitmapTextureAtlasTextureRegionFactory.createFromAsset(this.mBitmapTextureAtlas, this, "tower.png", 0, 0);
    this.mBitmapTextureAtlas.load();
}

@Override
public Scene onCreateScene() {
    this.mEngine.registerUpdateHandler(new FPSLogger());

    final Scene scene = new Scene();
    scene.setBackground(new Background(0.09804f, 0.6274f, 0.8784f));

    final float centerX = (CAMERA_WIDTH-100 - this.mFaceTextureRegion.getWidth()) / 2;
    final float centerY = (CAMERA_HEIGHT-100 - this.mFaceTextureRegion.getHeight()) / 2;
     face = new Sprite(centerX, centerY, this.mFaceTextureRegion, this.getVertexBufferObjectManager()) {
        @Override
        public boolean onAreaTouched(final TouchEvent pSceneTouchEvent, final float pTouchAreaLocalX, final float pTouchAreaLocalY) {
            this.setPosition(pSceneTouchEvent.getX() - this.getWidth() / 2, pSceneTouchEvent.getY() - this.getHeight() / 2);
            return true;
        }
    };

    scene.attachChild(face);
    scene.registerTouchArea(face);
    scene.setTouchAreaBindingOnActionDownEnabled(true);
    scene.setOnSceneTouchListener(new IOnSceneTouchListener() {

        @Override
        public boolean onSceneTouchEvent(Scene pScene, TouchEvent pSceneTouchEvent) {
            if (pSceneTouchEvent.isActionDown()) {
                lastXmove = pSceneTouchEvent.getX();
                lastYmove = pSceneTouchEvent.getY();
            }
            if (pSceneTouchEvent.isActionMove()) {
                float differenceX = pSceneTouchEvent.getX() - lastXmove;
                float differenceY = pSceneTouchEvent.getY() - lastYmove;
                mSmoothCamera.setCenter(mSmoothCamera.getCenterX() - differenceX, mSmoothCamera.getCenterY() - differenceY);
                lastXmove = pSceneTouchEvent.getX();
                lastYmove = pSceneTouchEvent.getY();

            }
            if (pSceneTouchEvent.isActionUp()) {

            }
            return true;
        }
    });
    return scene;
}

Saat ini kode ini akan menghasilkan tampilan kamera terbatas dan ketika saya mencoba menguji dan menyeret latar belakang, sprite akan bergetar. Saya telah mencoba membuat ambang batas sehingga gerakan yang terlalu kecil tidak akan memicu hambatan. Namun agar ambang batasnya tidak bergetar, sprite mulai sedikit gelisah.

Jika ada cara yang lebih baik untuk melakukan hal ini atau sumber daya yang belum pernah saya lihat untuk menggeser kamera dengan lebih baik, dorongan ke arah yang benar akan sangat dihargai.


person Mnazanda    schedule 03.08.2015    source sumber
comment
Anda tahu bahwa ada metode camera.setChaseEntity(entiy) yang bertanggung jawab untuk mengejar objek?   -  person Łukasz Motyczka    schedule 03.08.2015
comment
Saya pernah mendengarnya tetapi saya tidak tahu apakah hal itu dapat diterapkan dalam situasi ini. Apakah itu bisa digunakan untuk mengejar gerakan drag?   -  person Mnazanda    schedule 03.08.2015
comment
Apakah Anda mencoba mengubah kecepatan kamera Anda? Ubah 400, 400 menjadi 1500, 1500   -  person Łukasz Motyczka    schedule 04.08.2015
comment
Saya mencobanya tetapi tidak berhasil. Saya menemukan solusi dan mempostingnya. Terima kasih atas sarannya!   -  person Mnazanda    schedule 04.08.2015


Jawaban (1)


Dengan sedikit bermain-main dan mencari jawaban, inilah yang menurut saya berhasil. Mengubah bagian dari fungsi onSceneTouchEvent menjadi ini:

if (pSceneTouchEvent.isActionDown()) {
        // Obtain the initial touch coordinates when the scene is first pressed
        mInitialTouchX = pSceneTouchEvent.getX();
        mInitialTouchY = pSceneTouchEvent.getY();
    }

    if(pSceneTouchEvent.isActionMove()){
        if (!touchSpriteLock && !zoomLock) {
            // Calculate the offset touch coordinates
            final float touchOffsetX = mInitialTouchX - pSceneTouchEvent.getX();
            final float touchOffsetY = mInitialTouchY - pSceneTouchEvent.getY();

            // Apply the offset touch coordinates to the current camera coordinates

            mCamera.setCenter(mCamera.getCenterX() + touchOffsetX, mCamera.getCenterY() + touchOffsetY);


        }
    }

Aku terlalu mempersulitnya

person Mnazanda    schedule 04.08.2015