2013-12-13 2 views
5

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

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

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

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

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

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

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

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

Для того, чтобы получить его совершенным на рабочем столе я должен сделать:

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

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

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

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

Так что я изменил мой дп метод преобразования, если бы я должен был сделать 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(); 

Является ли это просто дешевый исправить или это довольно много, как это должно быть сделано?

+0

на рабочем столе он выводит 0,525, а на моем s4 он выводит 3,0. – Gibbo

ответ

4

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

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

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

Более подробную информацию, https://code.google.com/p/libgdx-users/wiki/AspectRatio

+0

Ах, хорошо, моя таблица на самом деле отличается по размеру между обоими устройствами, так как у моего телефона больше пикселей, кнопка выглядит значительно меньше, поэтому я загружаю шпиль, который больше. – Gibbo

+0

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

+0

Я собираюсь попробовать метод viewport, я действительно не хочу создавать разные res spprites, занимая много времени. Дайте мне знать, что вы думаете – Gibbo

1

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

cam = new OrthographicCamera(1366, 768); 
0

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

getting different screen resolutions

2

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

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

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 и System.getPropery("density"), вы можете изменять экраны, которые вы хотите имитировать.

Смежные вопросы