当前位置: 首页 > 知识库问答 >
问题:

LWJGL挂起时使用Slick2D文本加载PNG图像

鲜于凯歌
2023-03-14

在Mac OS X El Capitan,OpenGL版本4.1,我的LWJGL 3.0应用程序挂起时调用Slick2D函数纹理oader.get纹理()

下面是我试图用来加载纹理的代码。它与主循环在同一线程上运行,并在设置窗口后调用。

FileInputStream file = new FileInputStream("src/AppIcon.png");
texture = TextureLoader.getTexture("PNG", file);

该文件确实存在,当我注释掉用于纹理处理的代码时,代码运行良好,这就是这种方法

public int loadTexture(String filename){
    Texture texture = null;
    try{
        FileInputStream file = new FileInputStream(filename + ".png");
        //The app freezes here
        texture = TextureLoader.getTexture("png", file);
        //"LOADED" is never printed to the console.
        System.out.println("LOADED");
    }
    catch(FileNotFoundException e){
        e.printStackTrace();
    }
    catch(IOException e){
        e.printStackTrace();
    }
     return texture.getTextureID();
}

我尝试使用的纹理是1024 x 1024 PNG图像,

我还尝试使用小得多的16 x 16像素图像,

但我得到了同样的结果。

这两个图像在物理上都正常,没有记录任何错误,控制台中打印的最后一个内容来自Slick2D,声明

信息:使用Java PNG Loader=true

这是操作系统特有的错误,还是我做错了什么?

共有2个答案

双恩
2023-03-14

我认为代码只是有一个图像的路径,但是尽管你把文件类型放在它后面(. png),它不知道文件类型,尝试:

FileInputStream file = new FileInputStream(filename + ".png", PNG);

如果这不起作用,我可能会把“”搞砸,所以如果你再次出现错误,试试这个(但它可能不会起作用)

FileInputStream file = new FileInputStream(filename + ".png", "PNG");
唐烨煜
2023-03-14

事实证明,Slick2D与OS X上的GLFW不兼容。因此,我不得不使用stb绑定,即LWJGL 3.0的STBImageorg。lwjgl。机顶盒。STBImage

这是我用的密码

public int loadTexture(String filename){
    ByteBuffer imageBuffer;
    try{
        imageBuffer = readFile(filename);
    }
    catch (IOException e) {
        throw new RuntimeException(e);
    }

    IntBuffer w = BufferUtils.createIntBuffer(1);
    IntBuffer h = BufferUtils.createIntBuffer(1);
    IntBuffer comp = BufferUtils.createIntBuffer(1);

    ByteBuffer image = STBImage.stbi_load_from_memory(imageBuffer, w, h, comp, 0);
    if(image == null){
        throw new RuntimeException("Failed to load image: " + STBImage.stbi_failure_reason());
    }

    this.width = w.get(0);
    this.height = h.get(0);
    this.comp = comp.get(0);

    if(this.comp == 3){
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGB, this.width, this.height, 0, GL11.GL_RGB, GL11.GL_UNSIGNED_BYTE, image);
    }
    else{
        GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL11.GL_RGBA, this.width, this.height, 0, GL11.GL_RGBA, GL11.GL_UNSIGNED_BYTE, image);

        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    }

    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR);
    GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR);

    GL11.glEnable(GL11.GL_TEXTURE_2D);

    return GL11.glGenTextures();
}

private ByteBuffer readFile(String resource) throws IOException{
    File file = new File(resource);

    FileInputStream fis = new FileInputStream(file);
    FileChannel fc = fis.getChannel();

    ByteBuffer buffer = BufferUtils.createByteBuffer((int) fc.size() + 1);

    while(fc.read(buffer) != -1);

    fis.close();
    fc.close();
    buffer.flip();

    return buffer;
}

而且它和预期的一样工作

 类似资料:
  • null 附注:请告诉我,这是不是更好地在StackOverflow而不是这里问。

  • 我正在尝试制作一个2D基础游戏;有点像泰拉瑞亚,主要是提高我的openGL知识(使用Java和LWJGL)。 目前,我正在四边形上绘制纹理,一切都很好,但是,我似乎不能让这个窗口滚动(据我所知,这应该是由glTranslate完成的.. 代码: 绘制方法 在没有纹理的情况下,它可以很好地工作,但我不能让它工作以拯救我的生命。代码被临时设置为游戏循环,以尝试在按下空格键时进行一些基本翻译 我需要使用

  • 问题内容: 将以下内容放入文件 hello.py中 (如果还没有的话): 适当填写第一行。 现在输入 您会看到一些ls输出。 现在输入 然后从解释器类型中 和瞧!挂了!如果将代码包装在一个函数中,而是执行此操作,它将解开。 在模块初始化中使用Paramiko时为什么会挂起? Paramiko甚至如何知道它最初是在模块初始化期间使用的? 问题答案: Paramiko使用单独的线程进行基础传输。您 永

  • 问题内容: 我有一个用于下载文件的网络界面。当请求进入时,我的glassfish服务器从Web服务流式传输文件,然后将内容写入输出流。我的代码工作正常,除非当文件大小变得很大(如200 MB以上)时,它挂起,显示0%在浏览器中下载,并且文件从未下载。 当我在while循环内移动flush()方法时,它也适用于大型文件。我不确定将flush()放入循环是否有问题。不知道这东西实际上是如何工作的。我的

  • 无论出于什么原因,Ruby on Rails控制台都拒绝启动;只是挂起来了。我没有对代码做任何更改,其他使用相同版本的Ruby和Ruby on Rails的项目也没有问题。当我最后Ctrl+C时,我得到了这个指向spring的堆栈跟踪。 我无法解释为什么这会发生在一个时刻到下一个时刻,在那里它是工作良好的。我已经清除了所有的宝石通过RVM和重新安装所有通过捆绑命令,但仍然没有运气。任何想法都将不胜

  • 我有一个工作应用程序,但我想改进一点。方法(“private fun save”),负责保存我需要的信息,我希望使其异步。 但问题是,当我把它改成——“私有挂起fun save”的时候,我要做suspend和override fun拦截方法。但是由于它被覆盖,我得到一个错误: 冲突重载:public open suspend fun intercept(链:Interceptor.chain):c