Вопрос рендеринга матрицы LibGDX Box2D при использовании видовых экранов - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть вопрос по поводу рендеринга с box2d и libgdx.Как вы можете видеть на скриншоте ниже, у меня проблема при изменении разрешения окна.

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

Моя идея состоит в том, что мне как-то нужно настроить матрицу ( b2dCombinedMatrix ) для box2d перед рендерингом, но я понятия не имею, как.

Лично я считаю, что мне нужно сказать ему, что он должен использовать те же «границы рендеринга», что и в окне просмотра, но я не могу понять, как это сделать..

Вот метод рендеринга (проблема заключается в части комментариев прорисовки с подсветкой):

public void render(final float alpha) {
    viewport.apply();

    spriteBatch.begin();
    AnimatedTiledMapTile.updateAnimationBaseTime();
    if (mapRenderer.getMap() != null) {
        mapRenderer.setView(gameCamera);
        for (TiledMapTileLayer layer : layersToRender) {
            mapRenderer.renderTileLayer(layer);
        }
    }

    // render game objects first because they are in the same texture atlas as the map so we avoid a texture binding --> better performance
    for (final Entity entity : gameObjectsForRender) {
        renderEntity(entity, alpha);
    }
    for (final Entity entity : charactersForRender) {
        renderEntity(entity, alpha);
    }
    spriteBatch.end();

    // draw lights
    b2dCombinedMatrix.set(spriteBatch.getProjectionMatrix());
    b2dCombinedMatrix.translate(0, RENDER_OFFSET_Y, 0);
    rayHandler.setCombinedMatrix(b2dCombinedMatrix, gameCamera.position.x, gameCamera.position.y, gameCamera.viewportWidth, gameCamera.viewportHeight);
    rayHandler.updateAndRender();
    if (DEBUG) {
        b2dRenderer.render(world, b2dCombinedMatrix);
        Gdx.app.debug(TAG, "Last number of render calls: " + spriteBatch.renderCalls);
    }
}

И это метод изменения размера, который перемещает окно просмотра вверх на 4 единицы мира:

public void resize(final int width, final int height) {
    viewport.update(width, height, false);
    // offset viewport by y-axis (get distance from viewport to viewport with offset)
    renderOffsetVector.set(gameCamera.position.x - gameCamera.viewportWidth * 0.5f, RENDER_OFFSET_Y + gameCamera.position.y - gameCamera.viewportHeight * 0.5f, 0);
    gameCamera.project(renderOffsetVector, viewport.getScreenX(), viewport.getScreenY(), viewport.getScreenWidth(), viewport.getScreenHeight());
    viewport.setScreenY((int) renderOffsetVector.y);
}

Unscaled

Scaled image

1 Ответ

0 голосов
/ 24 сентября 2018

После нескольких часов возни с матрицей, я наконец-то заставил ее работать , но , на самом деле, есть очень простое решение моей проблемы: D

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

Так что настройте метод изменения размера на этот

public void resize(final int width, final int height) {
    viewport.update(width, height, false);
    // offset viewport by y-axis (get distance from viewport to viewport with offset)
    renderOffsetVector.set(gameCamera.position.x - gameCamera.viewportWidth * 0.5f, RENDER_OFFSET_Y + gameCamera.position.y - gameCamera.viewportHeight * 0.5f, 0);
    gameCamera.project(renderOffsetVector, viewport.getScreenX(), viewport.getScreenY(), viewport.getScreenWidth(), viewport.getScreenHeight());
    viewport.setScreenY((int) renderOffsetVector.y);

    rayHandler.useCustomViewport(viewport.getScreenX(), viewport.getScreenY(), viewport.getScreenWidth(), viewport.getScreenHeight());
}

и упростите рендерингметод

 // draw lights
    rayHandler.setCombinedMatrix(gameCamera);
    rayHandler.updateAndRender();
    if (DEBUG) {
        b2dRenderer.render(world, b2dCombinedMatrix);
        Gdx.app.debug(TAG, "Last number of render calls: " + spriteBatch.renderCalls);
    }

решил мою проблему.

Возможно, я глуп, но я не нашел useCustomViewport метод ни в одной из документации.В любом случае, решено!

...