Как масштабировать и прокручивать в libGdx?

Я пытаюсь как A.) Pinch увеличить мою сцену игры и B.) Переместить (прокрутить) мою сцену игры, но я не нашел много примеров. Я узнаю больше примеров, чем путем чтения документации API (хотя я готов прибегнуть к этому, если нет другого пути), и отсутствие примеров пошло на демпфер в моей игре.

Как это сделать?

Немного фона:

Я разрабатываю RPG для Android, и одна из возможностей моей игры - возможность купить карту игры за деньги, чтобы пользователи могли видеть расположение врагов на уровне и всех препятствиях. Поскольку большинство устройств Android довольно мало 3,5 "до 5", я подумал, что было бы неплохо позволить пользователю увеличить масштаб карты и затем прокрутить ее. Я пропустил большую часть кода игры.

Соответствующий код

У меня

 //Irrelevant code omitted for clarity and in accordance with the help center
    public class MyGdxGame implements ApplicationListener
    {
Texture mapTexture;
SpriteBatch batch;

@Override
public void create(){
    mapTexture = new Texture(Gdx.files.internal("map.png"));
    batch = new SpriteBatch();
}

@Override
public void render(){
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.glClear(GL20_GL_COLOR_BUFFER_BIT);
    batch.begin();
    batch.draw(0 , 0, Gdx.graphics.getWidth, Gdx.graphics.getHeight());
    batch.end();
}

@Override
public void dispose(){
}

//I want to zoom in to the map here
@Override
public void resize(int width, int height){
}

@Override
public void pause(){
}

@Override
public void resume(){
    }
}
3 голоса | спросил the_OTHER_DJMethaneMan 11 Maypm15 2015, 16:23:47

1 ответ


1

Вот код, который я использовал в своей стратегической игре для масштабирования, пинча и т. д.

Для обработки камеры и настройки разрешения экрана на основе соотношения сторон мы имеем:

  

AspectRatio   = (Поплавок) Gdx.graphics.getHeight () /(с плавающей точкой) Gdx.graphics.getWidth ();       высота = ширина * AspectRatio;       camera = new OrthographicCamera (ширина, высота);

camera.position.set(width/2,height/2,0);
camera.viewportWidth=width/2;
camera.viewportHeight=height/2;
camera.update();

Функция handleInput () вызывает все входные события на клавиатуре и обрабатывает их остальные входы, такие как щепотка и зум, будут обрабатываться реализацией GestureDetector

Чтобы закрепить камеру в границах, мы имеем:

  

camera.position.x = MathUtils.clamp (camera.position.x,   effectiveViewportWidth /2f, width - effectiveViewportWidth /2f);         camera.position.y = MathUtils.clamp (camera.position.y, effectiveViewportHeight /2f, height-effectiveViewportHeight /2f);

import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.Input;
import com.badlogic.gdx.Screen;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.OrthographicCamera;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.input.GestureDetector;
import com.badlogic.gdx.input.GestureDetector.GestureListener;
import com.badlogic.gdx.math.MathUtils;
import com.badlogic.gdx.math.Vector2;
import com.badlogic.gdx.math.Vector3;

public class ScreenExample implements Screen, GestureListener {
    private SpriteBatch batch;
    private Texture texture;
    public OrthographicCamera camera;
    float elapsedTime = 0;
    float zoomFactor = (float) 0;
    Vector3 touchPosition;
    float width = 800, height, aspectRatio;

    public ScreenExample() {
        aspectRatio = (float) Gdx.graphics.getHeight() / (float) Gdx.graphics.getWidth();
        height = width * aspectRatio;
        camera = new OrthographicCamera(width, height);
        camera.position.set(width / 2, height / 2, 0);
        camera.viewportWidth = width / 2;
        camera.viewportHeight = height / 2;
        camera.update();


        texture = new Texture(Gdx.files.internal("background.png"));


    }

    @Override
    public void show() {

        camera.zoom = 2;

        touchPosition = new Vector3();

        Gdx.input.setInputProcessor(new GestureDetector(this));

    }

    @Override
    public void render(float delta) {
        handleInput();
        camera.update();


        Gdx.gl.glClearColor(0, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);

        batch.setProjectionMatrix(camera.combined);

        batch.begin();
        batch.draw(texture, 0, 0, width, height);

        batch.end();


    }


    public void dispose() {
        batch.dispose();
        texture.dispose();
    }

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


    }

    @Override
    public void pause() {

    }

    @Override
    public void resume() {

    }

    @Override
    public boolean touchDown(float x, float y, int pointer, int button) {
// TODO Auto-generated method stub
        touchPosition.set(x, y, 0);
        camera.unproject(touchPosition);

        return false;
    }

    @Override
    public boolean tap(float x, float y, int count, int button) {
// TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean longPress(float x, float y) {
// TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean fling(float velocityX, float velocityY, int button) {
// TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean pan(float x, float y, float deltaX, float deltaY) {
        // TODO Auto-generated method stub

        camera.translate(-deltaX, deltaY);


        return false;
    }

    private void handleInput() {
        if (Gdx.input.isKeyPressed(Input.Keys.A)) {
            camera.zoom += 0.02;
        }
        if (Gdx.input.isKeyPressed(Input.Keys.Q)) {
            camera.zoom -= 0.02;
        }
        if (Gdx.input.isKeyPressed(Input.Keys.LEFT)) {
            camera.translate(-3, 0, 0);
        }
        if (Gdx.input.isKeyPressed(Input.Keys.RIGHT)) {
            camera.translate(3, 0, 0);
        }
        if (Gdx.input.isKeyPressed(Input.Keys.DOWN)) {
            camera.translate(0, -3, 0);
        }
        if (Gdx.input.isKeyPressed(Input.Keys.UP)) {
            camera.translate(0, 3, 0);
        }
        int rotationSpeed = 1;
        if (Gdx.input.isKeyPressed(Input.Keys.W)) {
            camera.rotate(-rotationSpeed, 0, 0, 1);
        }
        if (Gdx.input.isKeyPressed(Input.Keys.E)) {
            camera.rotate(rotationSpeed, 0, 0, 1);
        }

        camera.zoom = MathUtils.clamp(camera.zoom, 1.5f, 1.8f);

        float effectiveViewportWidth = camera.viewportWidth * camera.zoom;
        float effectiveViewportHeight = camera.viewportHeight * camera.zoom;

        camera.position.x = MathUtils.clamp(camera.position.x, effectiveViewportWidth / 2f, width - effectiveViewportWidth / 2f);
        camera.position.y = MathUtils.clamp(camera.position.y, effectiveViewportHeight / 2f, height - effectiveViewportHeight / 2f);
    }

    @Override
    public boolean zoom(float initialDistance, float distance) {


        if (initialDistance >= distance) {
            camera.zoom += 0.02;
        } else {
            camera.zoom -= 0.02;
        }


        return false;
    }

    @Override
    public boolean pinch(Vector2 initialPointer1, Vector2 initialPointer2,
                         Vector2 pointer1, Vector2 pointer2) {

// TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean panStop(float x, float y, int pointer, int button) {
        // TODO Auto-generated method stub
        return false;
    }


    public void hide() {
        // TODO Auto-generated method stub

    }
ответил Shersha Fn 2 Jam1000000amSat, 02 Jan 2016 01:29:07 +030016 2016, 01:29:07

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132