Создайте область текстуры
Сначала вы создаете объект TextureAtlas
, указывая на текстовый файл, описывающий ваш атлас (инструмент, создающий атлас, создаст два файла: изображение и текстовый файл с описанием его содержимого):
TextureAtlas myTextures = new TextureAtlas("images/packed.txt");
Затем вы можете найти TextureRegion
в этом атласе (то есть конкретную подтекстуру атласа). Регион должен иметь базовое имя исходного файла, который использовался (есть больше деталей и параметров, если вы следуете некоторым специальным соглашениям об именах для создания массивов элементов текстуры, но пока оставьте это):
TextureRegion region = myTextures.findRegion(fname);
Настроить текстурированную сетку
Чтобы нарисовать эту область текстуры на сетке, вам нужно инициализировать Mesh
с поддержкой координат текстуры:
Mesh myMesh = new Mesh(...,
new VertexAttribute(Usage.TextureCoordinates, 2, "y"));
new VertexAttribute(Usage.TextureCoordinates, 2, ...)
сообщает libGDX, что этот меш будет иметь две текстурные координаты для каждой вершины (традиционно две текстурные координаты называются u
и v
). У вас может быть множество различных атрибутов для каждой вершины, но я предполагаю, что единственным другим атрибутом является Usage.Position
с тремя значениями для пространственных координат x, y, z.
Теперь в массиве с плавающей запятой, который определяет вашу сетку (массив, который вы передаете в setVertices
), вам нужно установить пространственные координаты x, y и z плюс координаты текстуры u и v для каждой вершины:
final int floatsPerVertex = 5; // 3 spatial + 2 texture
float[] meshData = new float[numVerticies * floatsPerVertex];
for (int i = 0; i < numVerticies; i++) {
meshData[(i * floatsPerVertex) + 0] = ... ; // x coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 1] = ... ; // y coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 2] = ... ; // z coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 3] = ... ; // u texture coordinate of i'th vertex
meshData[(i * floatsPerVertex) + 4] = ... ; // v texture coordinate of i'th vertex
}
myMesh.setVertices(meshData);
Вы можете вычислить правильные u
и v
для конкретного TextureRegion
с помощью методов getU
, getV
, getU2
и getV2
. Обратите внимание, что координаты текстуры имеют начало координат (u1, v1) в левом верхнем углу, а ось Y указывает «вниз» (экранные и пространственные координаты в OpenGL обычно имеют начало в левом нижнем углу, а точки оси Y — «внизу»). вверх"). Это немного сложно, но очень гибко, так как вы можете переворачивать, растягивать или искажать текстуру, когда она отображается на вашей сетке.
Поскольку текстура большая (скажем, 512x512), а конкретная область является небольшим ее подмножеством (скажем, 20x20 при разрешении 128x128), в конечном итоге вы получите координаты текстуры сетки, которые используют только подмножество 20x20 всего изображения 512x512.
Визуализировать текстурированную сетку
Наконец, при рендеринге вам нужно привязать изображение и включить текстурирование перед рендерингом:
region.getTexture().bind();
Gdx.graphics.getGL10().glEnable(GL10.GL_TEXTURE_2D);
myMesh.render();
Gdx.graphics.getGL10().glDisable(GL10.GL_TEXTURE_2D);
Обратите внимание, что это гораздо менее эффективно, чем должно быть. Частично преимущество текстурного атласа заключается в том, что он должен содержать множество областей, которые можно визуализировать вместе, поэтому вам нужно только связать одну текстуру, а затем визуализировать множество различных текстурированных сеток из этой одной связанной текстуры.
SpriteBatch
поддерживает спрайты, определенные с помощью TextureRegion
, и AssetManager
поддерживают загрузку и поиск TextureAtlas
в качестве элемента первого класса.
person
P.T.
schedule
12.06.2012