2013-10-13 5 views
9

Итак, я супер топил, чтобы начать использовать LibGDX для моего первого названия Android для OUYA и ПК, но я сталкиваюсь с некоторыми проблемами с LibGDX. (На все мои вопросы можно ответить, посмотрев источник, но я действительно пытаюсь понять варианты дизайна).Поймите LibGDX Система координат и рисование спрайтов

Для начала система координат. Я создал проект, используя баночку Setup Project, и это создает OrthographicCamera как так

camera = new OrthographicCamera(1, h/w); 

Из моего чтения, я понимаю, что LibGdx использует левый нижний угол для 0,0 и ЮП. Хорошо. Я вижу, что довольно легко изменить на y вниз, если захочу, но я не понимаю следующий бит кода, который был создан.

Для созданного по умолчанию спрайта позиция устанавливается так.

logoSprite.setOrigin(logoSprite.getWidth()/2, logoSprite.getHeight()/2); 
logoSprite.setPosition(-logoSprite.getWidth()/2, -logoSprite.getHeight()/2); 

Когда я запускаю эту базовую программу, я вижу, что изображение логотипа, которое я добавил, сосредоточено на экране. Я пытаюсь понять, почему значения отрицательны в заданной позиции и почему она использует ширину и высоту sprite вместо графики w и h порта представления? Если я перейду на ширину и высоту экрана, изображение будет рисоваться в некотором нечетном положении в нижней правой части экрана.

Мой следующий вопрос: sprite.setSize vs sprite.setScale. Почему разница между ними? (Кажется, они делают то же самое, кроме setScale оставляет getWidth и getHeight неизменным).

Поскольку в моей игре будет использоваться 2D-камера для панорамирования, масштабирования и вращения, я пытаюсь понять, насколько я могу, о структуре libgdx, прежде чем начинать писать любой код.

В качестве побочного примечания у меня есть разработка игр и математический фон, и я сделал несколько 2D и 3D игр, используя XNA. Я нахожу LibGdx немного разочаровывающим, так как он не абстрагирует OpenGL столько, сколько я ожидал, и пока 2D-рисунок, который я экспериментировал, кажется более запутанным, чем должно быть!

Я также хотел отметить, что я планирую использовать позвоночник для своих анимаций. Должно ли это изменить мой выбор на использование y-up или y-down?

ответ

7

Если вы хотите нарисовать спрайт в центре экрана, сделать это в методе создания

logosprite.setposition(scrw/2-logosprite.getwidth()/2,scrh/2-logosprite.getheight/2); 

здесь ЮКЖДЫ это ваш ширина окна просмотра,

и scrh является высота вашего окна просмотра,

таким образом ваш спрайт будет находиться в центре экрана

sprite.setsize используется размером спрайта и sprite.setscale установки используются при масштабировании больших/маленькие текстур так, что его качество остается хорошим во всех устройствах (hdpi.mdpi, xhdpi, ldpi) ..

нет необходимости в если вы используете позвоночник, он работает плавно в libgdx.

+0

Спасибо за ответ. Я ожидал, что изображение будет центрировано при рисовании, установив начало координат в центр текстуры. Вот как это работает в XNA, но похоже, что LibGDX всегда рисует нижний левый угол независимо от источника. Другое дело, что камера была на 0,0, поэтому центр экрана равен 0,0. Код примера не добавляет вам вызов camera.update, поэтому мои изменения в позиции при масштабировании не применялись. Мой вопрос о позвоночнике был непосредственно связан с переключением камеры на y-down. Есть ли способ перевернуть анимацию позвоночника, как будто вы перевернете регион? – jjhavokk

+0

да, вы можете перевернуть анимацию, в libgdx, если мы хотим перевернуть анимацию, мы просто поместили ее в спрайт, а затем переливаем спрайт, как этот image.flip (true, false); –

1

Вы можете использовать только этот код, если это возможно

logoSprite.setPosition(Gdx.graphics.getWidth()/2 - image.getWidth()/2, 
Gdx.graphics.getHeight()/2 - image.getHeight()/2); 

Для центрирования спрайта в середину экрана, где «образом» является Texture вы загрузили/объявлены изначально.

Что касается причин, по которым это происходит, это связано с тем, что вы используете камеру. который изменяет вид много раз пройти через документации в libgdx о камере here

0

В моем случае мне нужно было установить положение камеры, а затем вызвать метод update(). Тогда никогда не забывайте, что камера (0,0) - ее центр. Все делается таким образом. Код моей камеры:

private void cameralariUpdateEt() { 
     cameraGame.position.set(cameraGame.viewportWidth * 0.5f, 
       cameraGame.viewportHeight * 0.5f, 0); 
     cameraGame.update(); 

     cameraScore.position.set(cameraScore.viewportWidth * 0.5f, 
       cameraScore.viewportHeight * 0.5f, 0); 
     cameraScore.update(); 
    } 

Вызов этого метода изнутри render();

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