Пикселы для погружений, настольные и андроид

Я использую Libgdx для кодирования Android-игры, и, как вы, возможно, знаете, многие разрешения экрана вызывают некоторые проблемы, если они сделаны неправильно. Поэтому я пытаюсь использовать этот блок DP, а не пиксели.

Однако у меня есть этот метод:

public static float pixelToDP(float dp){ return dp * Gdx.graphics.getDensity(); } 

Gdx.graphics.getDensity() фактически получает SCALE, так что это уже сделано для меня.

Теперь проблема, libgdx – кросс-платформа, которая хороша для тестирования. Когда я запускаю это на своем S4, который имеет разрешение 1920×1080 с разрешением 480 точек на дюйм, против моего ужасного и завышенного ноутбука, который имеет 1366×768 @ 92dpi, он размещается именно там, где я его хочу. На рабочем столе это далеко, всего несколько сотен пикселей по оси X и Y.

Это связано с тем, что мой экранный твитер измеряется при 92dpi, разрешение намного ниже, а фактическая игра не является полноэкранным экраном на рабочем столе?

Вот код для рисования объекта:

 table.setPosition(MathHelper.pixelToDP(150), MathHelper.pixelToDP(200)); 

Чтобы сделать его идеальным на рабочем столе, я должен сделать:

 table.setPosition(MathHelper.pixelToDP(480), MathHelper.pixelToDP(700)); 

Это даже не видно на моем телефоне, так как масштаб фактически равен 3x, что отличает 200 пикселей от экрана по оси Y.

Есть ли способ обойти это? Или мне в основном придется иметь дело с проверкой платформы и разными блоками кода?

Возможное решение:

Поэтому я изменил свой метод преобразования dp, если бы я должен был делать 100 * 0,5, он возвращал новое значение 50, но на самом деле я хочу значение orignal 100 + 100 * 0.5.

Не уверен, что это правильное исправление или нет, но, несмотря на то, что таблица столкнулась с тем же местом на ноутбуке и телефоне:

 public static float pixelToDP(float dp){ if(Gdx.graphics.getDensity() < 1) return dp + dp * Gdx.graphics.getDensity(); return dp * Gdx.graphics.getDensity(); 

Это просто дешевое решение или это в значительной степени, как это должно быть сделано?

    Использование независимых от плотности пикселей означает, что физический размер таблицы на всех экранах должен быть одинаковым. Поскольку экран вашего ноутбука (физически) намного больше, вы увидите, что таблица будет намного меньше, чем ожидалось.

    Я бы предложил альтернативный подход размещения объектов в долях размера. Например, 30% ширины или 45% высоты.

    Чтобы реализовать это, просто предположите разрешение сцены и поместите объекты по своему усмотрению, затем измените viewport в методе изменения размера, чтобы получить полный обзор. Надеюсь, поможет.

    Для получения дополнительной информации https://code.google.com/p/libgdx-users/wiki/AspectRatio

    Наилучшим подходом для этого является манипулирование плотностью на основе цели выполнения.

    Так что я обычно делаю, это сохранить плотность в поле в одноэлементном режиме и установить его на основе сценария:

     public class Game { public static float density; public static initDensity(){ if (GDX.app.getTarget() == 0){ density = 2.0f; }else { density = GDX.graphics.getDensity(); } } public float toPixel(float dip){ return dip * density; } } 

    При таком подходе вы можете «имитировать» более плотный экран, чем у вас на самом деле, и используя свойства в вашем -Ddensity=2 запуска, такие как -Ddensity=2 и System.getPropery("density") вы можете изменять экраны, которые вы хотите имитировать.

    Один из подходов имеет фиксированный размер видового экрана. Создайте свою камеру, например, 1366×768 и поместите все свои объекты, используя эту координату. Затем камера заполнит весь экран любой другой резолюции.

     cam = new OrthographicCamera(1366, 768); 

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

    Получение различных разрешений экрана