Я пытался отображать блоки на экране, каждый с разными текстурами. У меня есть spritesheet, а также код. Но я не могу получить конкретные координаты в спрайте, я не могу отобразить что-либо еще в качестве первого изображения.Отображение текстуры в spritesheet на основе ID
У меня есть эта функция визуализации создана:
public static void render(int texture, int blockID) {
float xPos = (float)blockID;
float yPos = 0;
while(xPos > 9) {
xPos -= 10;
yPos++;
}
glBindTexture(GL_TEXTURE_2D, texture);
glPushMatrix();
glBegin(GL_TRIANGLES);
glTexCoord2f((8f/160f) * xPos, (8f/160f) * yPos); glVertex2i(16, 0);
glTexCoord2f((8f/160f) * xPos, (8f/160f) * yPos); glVertex2i(0, 0);
glTexCoord2f((8f/160f) * xPos, (8f/160f) * yPos); glVertex2i(0, 16);
glTexCoord2f((8f/160f) * xPos, (8f/160f) * yPos); glVertex2i(0, 16);
glTexCoord2f((8f/160f) * xPos, (8f/160f) * yPos); glVertex2i(16, 16);
glTexCoord2f((8f/160f) * xPos, (8f/160f) * yPos); glVertex2i(16, 0);
glEnd();
glPopMatrix();
}
Он решает, какие текстуры взять из blockID, так что если blockID 1 занимает второе изображение из spritesheet, если это 2 его принимает третье изображение и т. д.
Но я не знаю, где мне нужно умножить переменные xPos и yPos на glTexCoord2f. Я пробовал разные способы, как:
glTexCoord2f(xPos/128f, 0f/128f); glVertex2i(16, 0);
glTexCoord2f(0f/128f, yPos/128f); glVertex2i(0, 16);
или
glTexCoord2f((0f/128f) * xPos, 0f/128f; glVertex2i(16, 0);
glTexCoord2f(0f/128f, (8f/128f)) * yPos; glVertex2i(0, 16);
и даже
glTexCoord2f(0f/128f, 0f/128f); glVertex2i(16 * xPos, 0);
glTexCoord2f(0f/128f, 8f/128f); glVertex2i(0, 16 * yPos);
Но никто не работал.
=== РЕДАКТИРОВАТЬ ===
Я почти удалось получить его работу. Но только с нечетными блочными идентификаторами. Если идентификатор blockID равен 1, он отображает первую текстуру, но если она равна 2, она отображает коричневый цвет (который не находится на моем спрайте), и если идентификатор блока равен 3, он отображает вторую текстуру на листе и т. Д.
Хорошо, мне удалось частично устранить проблему. Если BlockID является нечетным числом, он работает, но если он даже отображает коричневый квадрат, который даже не находится на спрайте. Любая идея, что вызывает это? – Snakybo
Я бы отладил его, выполнив математику перед вызовами и распечатав их в консольном/текстовом файле. Затем посмотрите, что происходит с цифрами напрямую. Погрузитесь с отладчиком и захватом, ручкой и бумагой, постройте координаты и выполните математику вручную. Кажется, что работает OpenGL, просто нужно настроить номера сейчас. –
Я получил его работу, спасибо за помощь – Snakybo