libgdx + android + Multiple Screens

Здравствуйте!

Возможно, на хабре обитают люди, использующие libgdx для разработки под андроид.

Поделитесь пожалуйста опытом, как именно вы решили проблему поддержки различных размеров экранов, разрешений, dpi при использовании ligdx?

Какой именно способ предпочитаете вы? Поделитесь описанием, идеями, ссылками или еще чем.

Система андроида сама умеет «подбирать» нужные ресурсы из drawable-hdpi/ drawable-ldpi/ и так далее.
Но при использовании libgdx это полезное свойство остается в стороне, увы.
Кроме того, libgdx «ищет» файлы в assets/, так уж он устроен изначально.

Еще вопрос: есть ли возможность сначала достать нужный файл из drawable/ (чтобы система сама выбрала предпочтительный) и лишь после этого «скормить» его libgdx?

Буду рад любым ответам.

Заранее спасибо.
  • Вопрос задан
  • 7424 просмотра
Пригласить эксперта
Ответы на вопрос 3
ertaquo
@ertaquo
В libgdx по-хорошему нужно использовать для загрузки ресурсов AssetManager, назначая ему загрузчики для разных видов ресурсов:
AssetManager manager = new AssetManager();
manager.setLoader(Texture.class, new TextureLoader( new InternalFileHandleResolver() ));

Т. е. в данном примере для класса Texture создается загрузчик TextureLoader, который будет получать FileHandle через InternalFileHandleResolver. Однако кроме InternalFileHandleResolver есть еще несколько подобных ему классов для получения FileHandle, одним из которых является ResolutionFileResolver:
Resolution[] resolutions = { new Resolution(320, 480, ".320480"),
	 		new Resolution(480, 800, ".480800"),
	 		new Resolution(480, 856, ".480854") };
ResolutionFileResolver resolver = new ResolutionFileResolver(new InternalFileHandleResolver(), resolutions);

Т. е. указываются размеры экрана и суффикс для имени файла. Насчет суффикса я, честно говоря, даже не скажу — до расширения он должен быть или после, но скорее всего до.
Пример (откуда я вытащил эти куски кода) можно взять тут: http://libgdx.googlecode.com/svn/trunk/tests/gdx-tests/src/com/badlogic/gdx/tests/AssetManagerTest.java.
Ответ написан
Suvitruf
@Suvitruf
Java/node.js/game-dev
Работать с относительными координатами, а при выводе уже с абсолютными.

Определить размер экрана в относительных координатах.
float CAMERA_WIDTH = 12f;
 float CAMERA_HEIGHT = 10f;
CAMERA_WIDTH =  CAMERA_HEIGHT* Gdx.graphics.getWidth()/Gdx.graphics.getHeight();


Коэффициенты посчитать.
ppuX = (float)Gdx.graphics.getWidth() / CAMERA_WIDTH;
ppuY = (float)Gdx.graphics.getHeight() / CAMERA_HEIGHT;


Всё. Теперь при рендеринге относительные координаты домножать на коэффициент. Правда область камеры будет различная на различных экранах, но зато растянутости объектов не будет.
Ответ написан
Комментировать
ertaquo
@ertaquo
Если жестко задавать размеры в пикселях — то да, одинакового отображения на разных экранах не получится. Поэтому, как вариант, можно опираться на Gdx.graphics.getDensity(), меняя размеры в зависимости от этого значения. Однако этот подход мне кажется не совсем верным, но как делать совсем правильно — я не знаю.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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