как сохранить внешний вид мозаичной карты при изменении разрешения в libGDX - PullRequest
0 голосов
/ 22 ноября 2018

Я создал тестовую карту для 2D-игры, которую я программирую.И все нормально с !, но когда я меняю разрешение, камера не умещается на экране правильно.

У меня есть спрайт плеера и карта тайлов, и я использую разрешение 1366x768, как вы можетесм. размер экрана соответствует:

enter image description here

но при изменении разрешения, например 640x480.Плеер не подходит в соответствии с новым разрешением, как вы можете видеть на этом рисунке:

enter image description here

Плеер кажется больше, но я хочу соответствоватьвесь экран в соответствии с новым разрешением, включая все спрайты.

Я думаю, что есть проблема с рендерингом камеры, но я не знаю, что я могу сделать, чтобы решить ее.Камера следит за движением игрока, и с этим все в порядке, но я хочу, чтобы экран соответствовал выбранным разрешениям.

Я добавлю некоторые части моего кода, которые вы можете увидеть:

Вот основной код:

public class codeTiled implements ApplicationListener {

... //Variables.....

public void create() {      
    manager = new AssetManager();
    manager.setLoader(TiledMap.class, new TmxMapLoader());
    manager.load("C:/Users/HOME/Desktop/tilemap/TiledMap/data/maps/test.tmx", TiledMap.class);
    manager.finishLoading();
    map = manager.get("C:/Users/HOME/Desktop/tilemap/TiledMap/data/maps/test.tmx", TiledMap.class);
    batch=new SpriteBatch();
    float w = Gdx.graphics.getWidth();
    float h = Gdx.graphics.getHeight();
    camera = new OrthographicCamera(50, 50 * (h / w));

    float unitScale = 1 / 8f;
    renderer = new OrthogonalTiledMapRenderer(map, unitScale);
    player=new playerEx(100, 100, camera);
}

public void render() {      
    handleInput();
    Gdx.gl.glClearColor(1, 1, 1, 1);
    Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
    camera.update();
    renderer.setView(camera);
    renderer.render();
    batch.begin();
    player.render(batch);
    batch.end();
}

private void handleInput() {

    if (Gdx.input.isKeyPressed(Input.Keys.ESCAPE)){
        System.exit(0);
    }
     camera.zoom = MathUtils.clamp(camera.zoom, 0.1f, 100/camera.viewportWidth);
    float effectiveViewportWidth = camera.viewportWidth * camera.zoom;
    float effectiveViewportHeight = camera.viewportHeight * camera.zoom;
    camera.position.x = MathUtils.clamp(camera.position.x, effectiveViewportWidth / 2f, 100 - effectiveViewportWidth / 2f);
    camera.position.y = MathUtils.clamp(camera.position.y, effectiveViewportHeight / 2f, 100 - effectiveViewportHeight / 2f);
}

И это часть моего класса игрока:

public class playerEx {

...//Variables....

public playerEx(int x, int y, OrthographicCamera camera){
    this.camera=camera;
    recP= new Rectangle();
    recP.height = 64;
    recP.width = 64;
    recP.x = x;
    recP.y = y;

    imagen=new Texture(Gdx.files.internal("C:/Users/HOME/Desktop/tilemap/TiledMap/data/sprites/player/minigunattack.png"));
    imagen2=new Texture(Gdx.files.internal("C:/Users/HOME/Desktop/tilemap/TiledMap/data/sprites/player/minigunstand.png")); 
    TextureRegion[][] tmp=TextureRegion.split(imagen,
            imagen.getWidth()/5,imagen.getHeight());
    imagen1=new Texture(Gdx.files.internal("C:/Users/HOME/Desktop/tilemap/TiledMap/data/sprites/player/feet.png"));
    TextureRegion[][] tmp1=TextureRegion.split(imagen1,
            imagen1.getWidth()/5,imagen1.getHeight());
    movPlayer=new TextureRegion[5];
    movFeet=new TextureRegion[5];

    for(int i=0;i<5;i++){
        movFeet[i]=tmp1[0][i];
    }for(int i=0;i<5;i++){
        movPlayer[i]=tmp[0][i];
    }animationAttack=new Animation(0.08f,movPlayer);
    animationFeet=new Animation(0.10f,movFeet);
    tiempo=0f;                                                                                                                
}

Опять же, камера запрограммирована следовать за игроком, и она работаетхорошо.Но когда я хочу изменить его на другое разрешение, спрайтер не подходит к плиточной карте: (.

Надеюсь, кто-нибудь может мне помочь с этим ... Спасибо!.

1 Ответ

0 голосов
/ 26 ноября 2018

Я рекомендую вам использовать область просмотра и некоторые значения констант для вашего мира.

Сначала мы определяем ширину и высоту экрана по умолчанию в пикселях.Не имеет значения, насколько большим будет конечный экран.В моем примере я говорю, что размер экрана по умолчанию: 512x256 пикселей.

Во-вторых, я должен решить, сколько пикселей составляет один метр.Поэтому, если я скажу, что 256 пикселей - это один метр, мой видовой экран показывает 2x1 метр моего мира.Это очень мало.Если я хочу, чтобы мой видовой экран показывал, например, 16 метров, я могу рассчитать: 512/16 = Pixel_Per_Meter.В данном случае 32.

Наконец, мы создаем класс Constants:

public class Constants {

    public static final float PPM = 32; // PPM = Pixel per Meter
    public static final float MPP = 1 / PPM; // MPP = Meter per Pixel

    public static final int WORLD_PIXEL_WIDTH = 512;
    public static final int WORLD_PIXEL_HEIGHT = 256;
    public static final float WORLD_WIDTH = WORLD_PIXEL_WIDTH / PPM; //in meter
    public static final float WORLD_HEIGHT = WORLD_PIXEL_HEIGHT / PPM; //in meter
}

Теперь, когда вы увидите позже в своей игре, показанный мир слишком мал или слишком велик, выможно изменить WORLD_PIXEL_WIDTH и WORLD_PIXEL_HEIGHT, чтобы показать более или менее

Теперь мы создаем OrthographicCamera, FitViewport и OrthogonalTiledMapRenderer

Окно просмотраочень важная часть игры.Если вы узнаете больше о Viewports, прочитайте часть viewport , вызывающую метод рендеринга из другого класса и Libgdx set ortho camera

Итак, сначала создайте наш OrthographicCamera 'camera' и наш FitViewport 'viewport'

camera = new OrthographicCamera();
viewport = new FitViewport(Constants.WORLD_WIDTH, Constants.WORLD_HEIGHT, camera);
camera.position.set(viewport.getWorldWidth() / 2, viewport.getWorldHeight() / 2, 0); // Differ from your I eat ann Apple 

Затем наши SpriteBatch 'batch' и TiledMap 'map'

batch = new SpriteBatch();
map = app.getAssets().loadSingleAsset("map/" + level + ".tmx", TiledMap.class);

И, наконец, наша OrthogonalTiledMapRenderer 'mapRenderer'

mapRenderer = new OrthogonalTiledMapRenderer(map, Constants.MPP);

Чтобы отобразить наш мир:

@Override
public void render(float delta) {

    camera.update();

    mapRenderer.setView(camera);
    mapRenderer.render();

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    player.draw(batch);
    batch.end();
}
...