2013-05-22 3 views
1

Я пытался отображать блоки на экране, каждый с разными текстурами. У меня есть 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, он отображает вторую текстуру на листе и т. Д.

ответ

0

Текстура координаты существуют в пределах диапазона: 0.0f -> 1.0f

Вам нужно рассчитать, как далеко (в процентах) изображение вашего спрайта, а затем подайте это в TexCoord в качестве поплавка.

Я думаю, вы должны использовать:

(8.0f/128.0f) * xPos    (you should cache the float once it works) 

Если это не работает, убедитесь, эти две вещи:

  • Hard закодированы значения работы (Доказывая, что загружается ваша текстура и инициализированы отлично)
  • правильные значения рассчитываются в пределах вашего метода визуализации

Кроме того, не забудьте сделать ваши треугольники с помощью glColor (1.0f, 1.0f, 1.0f), чтобы убедиться, что остальная часть вашего рендеринга в вашем приложении работает.

+0

Хорошо, мне удалось частично устранить проблему. Если BlockID является нечетным числом, он работает, но если он даже отображает коричневый квадрат, который даже не находится на спрайте. Любая идея, что вызывает это? – Snakybo

+0

Я бы отладил его, выполнив математику перед вызовами и распечатав их в консольном/текстовом файле. Затем посмотрите, что происходит с цифрами напрямую. Погрузитесь с отладчиком и захватом, ручкой и бумагой, постройте координаты и выполните математику вручную. Кажется, что работает OpenGL, просто нужно настроить номера сейчас. –

+0

Я получил его работу, спасибо за помощь – Snakybo

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

  • Нет связанных вопросов^_^