#android #libgdx
#Android #libgdx
Вопрос:
Как я могу поддержать (создать алгоритм) libgdx для поддержки нескольких разрешений экрана? Я заставил свое приложение работать на HTC Tattoo, используя статменты if с такими параметрами, как:
if (Gdx.input.getX()==40) {
Какой хороший алгоритм позволяет заставить это работать на больших экранах?
Я пробовал это, но без какого-либо результата:
publis static int translatex() {
float p = (float)Gdx.graphics.getHeight()*340;
return (int) p*Gdx.input.getX();
}
340 — это базовый x (разрешение x на моем телефоне), используемый мной в HTC Tattoo.
Итак ….. как я могу создать функцию для поддержки больших экранов с абсолютными значениями. Я не хочу менять if-инструкции.
Ответ №1:
Это довольно просто. По сути, вы создаете всю свою программу для своего собственного разрешения, но во всем, что касается позиционирования и размера текстуры, есть что-то вроде этого:
private void resize()
{
float x = Gdx.graphics.getWidth();
float y = Gdx.graphics.getHeight();
float changeX = x / assumeX; //being your screen size that you're developing with
float changeY = y / assumeY;
position = new Vector2(position.x * changeX, position.y * changeY);
width = startWidth * changeX;
height = startHeight * changeY;
bounds = new Vector2 (position.x, (Gdx.graphics.getHeight() - position.y) - height);
}
По сути, то, что вы делаете, это берете каждый созданный объект и запускаете его через что-то, что увеличивается / уменьшается в зависимости от изменения значений x / y в вашем разрешении. Чем дальше он от родного, тем больше он будет. Когда что-то где-то проверяется или что-то куда-то помещается, всегда кодируйте это как желаемое разрешение, но запустите его с помощью функции изменения размера, прежде чем отображать его или позволить ему взаимодействовать с остальной частью вашей программы.
Комментарии:
1. Пример такой реализации см. в моем руководстве по StringBuild на libgdx wiki.
2. Что такое startWidth? И функция изменения размера имеют 2 параметра: int width, int height, что startWidth — это ширина?
3. начальная ширина / высота будет соответствовать размеру вашей текстуры изначально до изменения размера. новые ширина и высота увеличиваются по сравнению с changeX и changeY. Bounds — это просто вектор2, удерживающий положение противоположного угла, чтобы вы могли легко узнать границы объекта. Вызовите объект для создания -> получите все начальные значения, такие как положение, ширина, высота -> Преобразуйте их с помощью функции resize() -> нарисуйте текстуру на экране. Мы сохраняем startHeight и height отдельно в случае использования TextureRegions, когда вам нужно знать базовый размер текстуры, чтобы вы могли правильно ее растянуть
4. Не могли бы вы, пожалуйста, ввести какой-нибудь код? Я не являюсь носителем английского языка.
5. Я использовал этот метод для изменения размера своего изображения, и он отлично сработал! Спасибо! Хотя я столкнулся с одной проблемой. Размер моих изображений изменяется, но когда я вызываю
setRotation()
позже, изображение поворачивается вокруг своей старой центральной точки. Есть идеи?
Ответ №2:
Смотрите более элегантное решение на http://www.java-gaming.org/index.php?topic=25685.0 (также смотрите комментарий Нейта к этому решению).
Также, если вы используете scene2d
, обратите внимание, что в настоящее время (libgdx 0.9.6) stage.setViewport
метод должен обладать этой функциональностью, но на самом деле он ведет себя не так, как можно было бы ожидать.
Обновление: исправлен setViewport, так что это работает так, как ожидалось.