1

Player クラスから「Player.png」ファイルをロードすると、この奇妙なエラーが発生します。

コードの構成が非常にずさんで、使用する方法がひどいことは理解しています。コードの半分はチュートリアルから借用しています。

2 つのクラスが行うことになっているのは、W、A、S、D キーで上下左右に移動できる「プレイヤー」スプライトで画面を埋める緑色のタイルで画面を作成することです。

エラー:

java.io.IOException: org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader) の org.newdawn.slick.opengl.InternalTextureLoader.getTexture(InternalTextureLoader.java:293) で、現在のハードウェアに大きなテクスチャを割り当てようとしています.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) で test.PlayerClass.render(PlayerClass.java:69) で test.Main.render(Main.java:110) で test.Main.run(Main.java:82) ) 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);
   }
 }
4

2 に答える 2

1

これを実行します:

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

グラフィックカードで許可されている最大テクスチャサイズを教えてくれます。グラフィック カードが、使用しようとしているサイズのテクスチャを処理できることを確認してください。エラーによると、それはできません。

于 2011-12-20T01:59:32.953 に答える
0

大きtile.pngさ - テクスチャの最大サイズはカードによって異なりますが、他の要因もあると思います。あなたのファイルはおそらくこの次元の外にあります。

Cody's answer は、カードの最大テクスチャ サイズを取得する方法を提供します。他の多くの人が使用するゲームを作成している場合は、実行中のカードの機能に基づいて異なる解像度のテクスチャをロードするように、または単にそのコードをゲーム コードに統合することをお勧めします。サポートしたいカードで動作するデフォルトを見つけ、それをすべてのインストールに使用します。

この問題の詳細、歴史、および役立つと思われるその他の技術情報を説明する追加資料を次に示します。

于 2011-12-20T02:00:53.753 に答える