У меня есть вопрос по поводу рендеринга с 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);
}