2012-02-25 12 views
3

私は、2Dタイルベースのプロジェクト用の単純なテクスチャマネージャを作ろうとしています。シンプルなJava OpenGLテクスチャマネージャー

私が持っているのは、文字列(テクスチャ名)とテクスチャのハッシュマップを持つクラスです。名前がハッシュマップに存在しない場合は、TextureIO.newTexture(..)を使用して名前を作成し、ハッシュマップに格納します。

これは私がテクスチャをロードしようとすると、私が取得エラーです:

Exception in thread "Timer-0" javax.media.opengl.GLException: java.lang.IllegalArgumentException: Illegally formatted version identifier: "null" 
    at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:271) 
    at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:410) 
    at javax.media.opengl.GLCanvas.display(GLCanvas.java:244) 
    at com.sun.opengl.util.Animator.display(Animator.java:144) 
    at com.sun.opengl.util.FPSAnimator$1.run(FPSAnimator.java:95) 
    at java.util.TimerThread.mainLoop(Unknown Source) 
    at java.util.TimerThread.run(Unknown Source) 
Caused by: java.lang.IllegalArgumentException: Illegally formatted version identifier: "null" 
    at com.sun.opengl.impl.FunctionAvailabilityCache$Version.<init>(FunctionAvailabilityCache.java:354) 
    at com.sun.opengl.impl.FunctionAvailabilityCache.initAvailableExtensions(FunctionAvailabilityCache.java:133) 
    at com.sun.opengl.impl.FunctionAvailabilityCache.isExtensionAvailable(FunctionAvailabilityCache.java:104) 
    at com.sun.opengl.impl.GLContextImpl.isExtensionAvailable(GLContextImpl.java:351) 
    at com.sun.opengl.impl.GLImpl.isExtensionAvailable(GLImpl.java:30493) 
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:416) 
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:381) 
    at com.sun.opengl.util.texture.Texture.<init>(Texture.java:182) 
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:445) 
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:465) 
    at dqs.manager.TextureManager.loadTexture(TextureManager.java:31) 
    at dqs.world.World.draw(World.java:59) 
    at dqs.scene.GameScene.display(GameScene.java:58) 
    at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78) 
    at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435) 
    at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194) 
    at javax.media.opengl.GLCanvas$DisplayOnEventDispatchThreadAction.run(GLCanvas.java:452) 
    at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 
Caused by: java.lang.NullPointerException 
    at com.sun.opengl.impl.FunctionAvailabilityCache$Version.<init>(FunctionAvailabilityCache.java:309) 
    ... 30 more 
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    at com.sun.opengl.impl.mipmap.Mipmap.closestFit(Mipmap.java:252) 
    at com.sun.opengl.impl.mipmap.Mipmap.gluBuild2DMipmaps(Mipmap.java:726) 
    at javax.media.opengl.glu.GLU.gluBuild2DMipmapsJava(GLU.java:1525) 
    at javax.media.opengl.glu.GLU.gluBuild2DMipmaps(GLU.java:1581) 
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:523) 
    at com.sun.opengl.util.texture.Texture.updateImage(Texture.java:381) 
    at com.sun.opengl.util.texture.Texture.<init>(Texture.java:182) 
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:445) 
    at com.sun.opengl.util.texture.TextureIO.newTexture(TextureIO.java:465) 
    at dqs.manager.TextureManager.loadTexture(TextureManager.java:31) 
    at dqs.world.World.draw(World.java:59) 
    at dqs.scene.GameScene.display(GameScene.java:58) 
    at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78) 
    at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435) 
    at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194) 
    at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:412) 
    at javax.media.opengl.GLCanvas.display(GLCanvas.java:244) 
    at javax.media.opengl.GLCanvas.paint(GLCanvas.java:277) 
    at sun.awt.RepaintArea.paintComponent(Unknown Source) 
    at sun.awt.RepaintArea.paint(Unknown Source) 
    at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
    at java.awt.EventQueue.access$000(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.awt.EventQueue$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.awt.EventQueue$2.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

エラーは、私は私のTextureManager内からloadTextureを呼び出した瞬間に発生します。ここで

はTextureManagerコードです:

:これは私が使用してそれを呼び出したコードである

new TextureManager(); 

public class TextureManager { 

    private static HashMap<String, Texture> textureMap; 

    public TextureManager() { 

     textureMap = new HashMap<String, Texture>(); 

    } 

    public static void loadTexture(String name) { 

     if(textureMap.containsKey(name)) return; 

     try { 

      textureMap.put(name, TextureIO.newTexture(new File("textures/" + name + ".png"), true)); 
     } 
     catch (GLException e) { 

      e.printStackTrace(); 
     } 
     catch (IOException e) { 

      e.printStackTrace(); 
     } 
    } 

    public static void bindTexture(String name) { 

     textureMap.get(name).bind(); 
    } 
} 

A TextureManagerオブジェクトが既に経由して、以前のコードで作成されています

TextureManager.loadTexture("tree"); 

パステクスチャ/ tree.pngも存在します。

以前のプロジェクトでこれと似たようなことをしましたが、ハッシュマップを使用する代わりに、私が使ったテクスチャごとにTextureManagerの変数をハードコーディングしました。私は古いTextureManagerがコンストラクタを介してGLを渡したが、コードでそれを使用していないため、スレッドにGLコンテキストがないことが原因であると思われます。 loadTexture関数を呼び出した描画関数もGL変数に渡されます。

答えて

2

ああ問題の原因を突き止めました。私はglBeginとglEndの呼び出しの中でテクスチャを束縛していました。

残念ながら私の質問には解決策を提供していたコードが含まれていませんでしたが、私の質問を見てみんなありがとう。それについての謝罪。

これは今後も他の誰かを助けることができればうれしいことです。

関連する問題