Загрузка изображений в 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);
Другие вопросы по тегам