Загрузка изображений в Android-приложение с помощью libgdx
Я прошел хороший урок, который создает простую игру libgdx, ловящую капли дождя в ведре. Я хочу больше узнать об использовании изображений, поэтому я попытался заменить каплю дождя на ребенка.
Когда я пытаюсь загрузить baby.png, я получаю следующую ошибку:
com.badlogic.gdx.utils.GdxRuntimeException: Texture width and height must be
powers of two: 60x83
Как я могу загрузить изображение любого размера, который я хочу?
3 ответа
Небольшое чтение привело меня к описанию TextureAtlas и TexturePacker, которые объединяют кучу маленьких изображений в одно большое. Это делает их быстрее загружать и рисовать. Как говорит Викальп, вы также можете просто отключить правило о размерах изображения, если вас не волнует разница в производительности.
Texture.setEnforcePotImages(false);
Вы можете узнать больше об игровых атласах в игровом классе Udacity HTML5.
Чтобы создать свой собственный атлас, вы можете начать с графического интерфейса TexturePacker, но я рекомендую в конечном итоге создать проект командной строки для автоматической упаковки необработанных изображений.
Я опубликовал пример проекта, который берет пример кода из руководства по ведру и дождевой капле и переключается на использование TextureAtlas. Теперь я загружаю атлас, а затем загружаю изображения из атласа.
atlas = new TextureAtlas(Gdx.files.internal("atlas/plank.pack"));
dropImage = atlas.findRegion("images/baby");
bucketImage = atlas.findRegion("images/bucket");
Я обнаружил одну ошибку: изображения не загружались в HTML-проект. Я обнаружил, что вы можете обойти ошибку, поместив все ваши изображения в подпапку.
Я создал новый проект для хранения TexturePacker и любых юнит-тестов, которые я хочу добавить позже. Упаковщик текстур выглядит так:
package com.github.donkirkby.plank;
import com.badlogic.gdx.tools.imagepacker.TexturePacker2;
public class PlankPacker {
public static void main (String[] args) throws Exception {
TexturePacker2.process(
"raw-assets", // source folder
"../plank-game-android/assets/atlas", // destination
"plank.pack"); // data file
}
}
Перед загрузкой изображения напишите..
Texture.setEnforcePotImages(false);
Вы можете сделать это в функции создания списка приложений. Это самый простой способ, если вы не хотите создавать атлас текстуры.
Вы также можете поместить картинку (в верхнем левом углу) в текстуры 128x128, а также: Afaik медленнее использует текстуры, отличные от двух, и требует больше VRAM. Из-за архитектуры GPU и "медленной" обработки привязок текстур в OpenGL всегда рекомендуется объединять изображения, которые используются одновременно, в одну большую текстуру pow-two и захватывать их в виде областей этой текстуры, чтобы ускорить вашу работу. приложение. Использование и захват вашей текстуры будет выглядеть так:
Texture texture = Gdx.files.internal("data/yourtexture.png");
TextureRegion region = new TextureRegion(texture, 0, 0, 60, 83);
Для рисования что-то вроде этого:
batch.draw(region, positionX, positionY);