java.io.IOException Трудность при добавлении текстуры «игрок» на экран - PullRequest
1 голос
/ 20 декабря 2011

Я получаю эту странную ошибку при загрузке файла «Player.png» из класса Player.

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

То, что должны сделать 2 класса, - это создать экран с зелеными плитками, заполняющими экран спрайтом «игрока», который может перемещаться вправо, влево, вверх и вниз с помощью клавиш W, A, S, D.

ошибка:

java.io.IOException: попытка выделить большую текстуру для текущего оборудования. в org.newdawn.slick.opengl.InternalTextureLoader.getTexture (InternalTextureLoader.java:293) в org.newdawn.slick.opengl.InternalTextureLoader.getTexture (InternalTextureLoader.java:231) в org.newdawn.slick.opengl.InternalTextureLoader.getTexture (InternalTextureLoader.java:184) в org.newdawn.slick.opengl.TextureLoader.getTexture (TextureLoader.java:64) в org.newdawn.slick.opengl.TextureLoader.getTexture (TextureLoader.java:24) at test.PlayerClass.render (PlayerClass.java:69) at test.Main.render (Main.java:110) at test.Main.run (Main.java:82) at test.Main.main (Main.java:27)

Основной класс

public class Main{

    private static boolean running = true;
    public static final int WIDTH = 1024;
    public static final int HEIGHT = 768;
    private static Texture tile;

static PlayerClass playerClass = new PlayerClass(100, 100, 32, 32);


public static void main(String[] args){

    Main main = new Main();
    main.run(); 
}

//Initialize Method
public static void init(int width, int height ) throws LWJGLException
{
    DisplayMode[] m = Display.getAvailableDisplayModes();
    for(DisplayMode mode : m)
    {
        if(mode.getWidth() == 1024 && mode.getHeight() == 768   && mode.getBitsPerPixel() == 32)
        {
            Display.setDisplayMode(mode);
        }

    }
    Display.setTitle("Game");
    Display.setVSyncEnabled(true);
    Display.sync(100);
    Display.create();

    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();

    GL11.glOrtho(0, Display.getDisplayMode().getWidth(), Display.getDisplayMode().getHeight(), 0, -1, 1 );
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glLoadIdentity();

    GL11.glEnable(GL11.GL_ALPHA_TEST);
    GL11.glAlphaFunc(GL11.GL_GREATER, 0.2f);
    GL11.glEnable(GL11.GL_TEXTURE_2D);



    try {
        tile = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("RPG/tile.png"));
    } 
    catch (IOException e) 
    {
        e.printStackTrace();
    }
}

public void run()
{
    try {
        init(1024, 768);
    } catch (LWJGLException e) {
        e.printStackTrace();
    }
    while(running)
    {
        Display.update();
        drawTiled(WIDTH, HEIGHT);
        input();
        update();
        render();

    }
    cleanup();
}

public static void input()
{
    if(Keyboard.isKeyDown(Keyboard.KEY_ESCAPE))
    {
        running = false;
    }

    playerClass.input();

}

public static void update()
{


}
public static void render()
{
    GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
    GL11.glLoadIdentity();

    try {
        playerClass.render();
    } catch (IOException e) {
        e.printStackTrace();
    }

    Display.update();


}

public static void cleanup()
{
    Display.destroy();
}

public void drawTiled(int screenWidth, int screenHeight) {
    Color.white.bind();
    tile.bind();
    int numberPerRow = screenWidth / tile.getTextureWidth();
    int numberOfRows = screenHeight / tile.getTextureHeight();
    GL11.glBegin(GL11.GL_QUADS);
    for (int j = 0; j < numberOfRows; j++) {
        //System.out.print("{");
        for (int i = 0; i < numberPerRow; i++) 
        {

            //top left
            GL11.glTexCoord2f(0, 0);
            GL11.glVertex2f(tile.getTextureWidth() * i, tile.getTextureHeight() * j);

            //top right
            GL11.glTexCoord2f(1, 0);
            GL11.glVertex2f(tile.getTextureWidth() * (i + 1), tile.getTextureHeight() * j);

            //bottom right
            GL11.glTexCoord2f(1, 1);
            GL11.glVertex2f(tile.getTextureWidth() * (i + 1), tile.getTextureHeight() * (j + 1));

            //bottom left
            GL11.glTexCoord2f(0, 1);
            GL11.glVertex2f(tile.getTextureWidth() * i, tile.getTextureHeight() * (j + 1));    
       }

    }
  }
}

Класс игрока

public class PlayerClass {
  private float x, y;
  private int w, h;
  private Texture player;
  private FloatBuffer verts = BufferUtils.createFloatBuffer(2 * 4);
  private FloatBuffer tex = BufferUtils.createFloatBuffer(2 * 4);

public PlayerClass(float X, float Y, int W, int H)
{
    x = X;
    y = Y;
    w = W;
    h = H;

    verts.put(new float[]{
        0.0f, 0.0f,
        32.0f, 0.0f,
        32.0f, 32.0f,
        0.0f, 32.0f

    });

    tex.put(new float[]{
        0.0f, 0.0f,
        1.0f, 0.0f,
        1.0f, 1.0f,
        0.0f, 1.0f
    });     
}

public void input()
{
    if(Keyboard.isKeyDown(Keyboard.KEY_W))
    {
        y -= 10;
    }

    else if(Keyboard.isKeyDown(Keyboard.KEY_S))
    {
        y += 10;
    }

    if(Keyboard.isKeyDown(Keyboard.KEY_A))
    {
        x -= 10;
    }

    else if(Keyboard.isKeyDown(Keyboard.KEY_D))
    {
        x += 10;
    }

}

public void render() throws IOException
{
    player = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("RPG/player.png"));

    player.bind();
    verts.rewind();
    tex.rewind();

    GL11.glEnableClientState(GL11.GL_VERTEX_ARRAY);
    GL11.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);

    GL11.glTranslatef(x, y, 0.0f);

    GL11.glVertexPointer(2, 0, verts);
    GL11.glTexCoordPointer(2, 0, tex);

    GL11.glDrawArrays(GL11.GL_QUADS, 0, 4);

    GL11.glTranslatef(-x, -y, 0.0f);

    GL11.glDisableClientState(GL11.GL_VERTEX_ARRAY);
    GL11.glDisableClientState(GL11.GL_TEXTURE_COORD_ARRAY);
   }
 }

Ответы [ 2 ]

1 голос
/ 20 декабря 2011

Запустите это:

System.out.println(GL11.glGetInteger(GL11.GL_MAX_TEXTURE_SIZE));

Он сообщит вам максимальный размер текстуры, допустимый для вашей видеокарты. Убедитесь, что ваша видеокарта может обрабатывать текстуру того размера, который вы пытаетесь использовать. По ошибке не может.

0 голосов
/ 20 декабря 2011

Насколько велика tile.png - максимальный размер текстуры может варьироваться в зависимости от вашей карты, и я думаю, от некоторых других факторов. Возможно, ваш файл находится за пределами этого измерения.

Ответ Коди дает вам возможность получить максимальный размер текстуры для вашей карты. Если вы пишете игру для использования многими другими людьми, вы, вероятно, захотите интегрировать этот код в код игры таким образом, чтобы он загружал текстуры с различным разрешением в зависимости от возможностей карты, на которой он работает, или просто найдите значение по умолчанию, которое работает на любой плате, которую вы хотите поддерживать, и используйте ее для всех установок.

Вот некоторые дополнительные материалы, которые объяснят больше об этой проблеме, немного истории о ней и больше технической информации, которая может оказаться полезной:

...