В Java есть ли в LWJGL / OpenGL эквивалент subImage BufferedImage для создания листов спрайтов? - PullRequest
0 голосов
/ 01 февраля 2012

Я делаю тест на получение шрифта в Java, в основном получаю больший png алфавита, затем разрезаю его на более мелкие части, чтобы получить каждую отдельную букву в виде отдельного подизображения.До сих пор я использовал BufferedImage и java.awt.Graphics.

Однако я планирую использовать LWJGL в будущем и хотел бы познакомиться с ним поближе (для этого теста я даже создаюдисплей с LWJGL), и хотел бы знать, был ли эквивалент субизображений в OpenGL LWJGL.Я предпочел бы не быть гладким.

Вот изображение, на случай, если оно поможет: http://i.imgur.com/LeL58.png

А вот код, который я использую, он может помочь.

package typeandscreen;

*imports go here, cut to save space*
public class Font{

    final int width = 78;
    final int height = 12;
    final int rows = 2;
    final int cols = 13;

BufferedImage letters[] = new BufferedImage[rows*cols]; 


void test(){
    try{
        final BufferedImage totalImage = ImageIO.read(new File("ABCabcs.png"));

    for(int i = 0; i < rows; i++){

        for(int j = 0; j < cols; j++){
            letters[(i * cols) + j] = totalImage.getSubimage(
                j * width,
                i * height,
                width,
                height
            );
        }
    }
    } catch(IOException e){
        e.printStackTrace();
    }
}
}

1 Ответ

1 голос
/ 16 февраля 2012

Я не уверен насчет конкретного метода, но вот мой метод для поддержки Spritesheets ...

Сначала я загружаю все изображение в одну текстуру, затем назначаю несколько переменных, чтобы помочь определить, какую часть листа Sprite я хочу отобразить, используя следующий метод:

public void setSpriteSheetPosition(int columns, int rows, int which_column, int which_row, int wide, int tall)
{
    this.columns = columns; //Number of columns the sprite sheet has
    this.rows = rows;  //Number of rows the sprite sheet has.
    this.which_column = which_column; //Which column and row I want to display on the Sprite
    this.which_row = which_row;
    this.wide = wide; //How many cells wide I want the sprite to be composed of
    this.tall = tall; //How many cells tall I want the sprite to be composed of
}

Последние две переменные позволяют мне иметь таблицу с переменными размерами ячеек.

Тогда мой метод рендеринга Sprite выглядит следующим образом ...

public void draw()
    {
        glPushMatrix();
        imageData.getTexture().bind();
        int tx = (int)location.x;
        int ty = (int)location.y;
        glTranslatef(tx, ty, location.layer);

        float height = imageData.getTexture().getHeight();
        float width = imageData.getTexture().getWidth();

        float texture_X = ((float)which_column/(float)columns)*width;
        float texture_Y = ((float)which_row/(float)rows)*height;
        float texture_XplusWidth = ((float)(which_column+wide)/(float)columns)*width;
        float texture_YplusHeight = ((float)(which_row+tall)/(float)rows)*height;

        glBegin(GL_QUADS);
        {
            glTexCoord2f(texture_X, texture_Y);
            glVertex2f(0, 0);

            glTexCoord2f(texture_X, texture_YplusHeight);
            glVertex2f(0, getHeight());

            glTexCoord2f(texture_XplusWidth, texture_YplusHeight);
            glVertex2f(getWidth(), getHeight());

            glTexCoord2f(texture_XplusWidth, texture_Y);
            glVertex2f(getWidth(), 0);
        }
        glEnd();
        glPopMatrix();
    }

Который будет рисовать правильную ячейку (или ячейки) таблицы спрайтов.

...