私は数年前からプログラミングを行っており、Java LWJGL を試してみたかったのですが、Slick-Util ライブラリの使用を勧められたので、すべてをセットアップしました。いくつかのプロジェクトに取り組んできましたが、この問題に遭遇したことはありません。 . しかし、openGL にテクスチャをバインドするときに、同じ間違ったテクスチャが毎回バインドされるという問題が発生しました。私は最初に、一連のクラスなどを含むプロジェクトでこの問題に遭遇し、問題を 1 つの jar ファイルに凝縮しようとしました。
コードを示す前に、サンプル ファイルがどのように機能するかを説明したいと思います。基本的に、私のプロジェクトには 4 つの PNG があります。res/textures/character/texturesHere に含まれています。PNG の名前は、char_d.png、char_u.png、char_l.png、char_r.png のようになります。4つすべてを確認しましたが、4つすべてがキャラクターの方向のテクスチャが異なるはずです. これは、プロジェクトのリソースに問題がないことを証明するためです。これは、「メイン」クラス ファイルに凝縮された問題全体です。
package main_p;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.*;
import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import static org.lwjgl.opengl.GL11.*;
public class Main
{
public final int srcWidth = 1280;
public final int srcHeight = 720;
public float x = 150;
public float y = 150;
public float w = 40;
public float h = 40;
public Texture char_down;
public Texture char_right;
public Texture char_left;
public Texture char_up;
public Main()
{
try
{
Display.setTitle("Escape Alpha v0.0.1");
Display.setDisplayMode(new DisplayMode(srcWidth, srcHeight));
Display.create();
}
catch (LWJGLException e)
{
e.printStackTrace();
}
initGL();
initTextures();
loop();
}
public void loop()
{
glClear(GL_COLOR_BUFFER_BIT);
while (!Display.isCloseRequested())
{
glBegin(GL_QUADS);
char_left.bind();
glTexCoord2f(0, 0);
glVertex2f(x, y);
glTexCoord2f(1, 0);
glVertex2f(x + w, y);
glTexCoord2f(1, 1);
glVertex2f(x + w, y + h);
glTexCoord2f(0, 1);
glVertex2f(x, y + h);
glEnd();
Display.update();
Display.sync(60);
}
Display.destroy();
}
public void initGL()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, srcWidth, srcHeight, 0, 1, -1);
glMatrixMode(GL_MODELVIEW);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
public void initTextures()
{
char_down = loadTextureFrom("character/char_d.png");
char_up = loadTextureFrom("character/char_u.png");
char_left = loadTextureFrom("character/char_l.png");
char_right = loadTextureFrom("character/char_r.png");
}
public Texture loadTextureFrom(String path)
{
try
{
return TextureLoader.getTexture("PNG", new FileInputStream(new File("res/textures/" + path)));
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
return null;
}
public static void write(Object ob)
{
System.out.println(ob);
}
public static void main(String[] args)
{
new Main();
}
}
私が気づいたことの 1 つは、initTextures() メソッド内で、最後にロードされたテクスチャを変更すると、バインドしたすべてのテクスチャが initTextures() でロードされた最後のテクスチャをレンダリングすることになることです。
この例では、Texture char_left をバインドしますが、代わりに char_right を使用します。これは、initTextures() メソッドで最後に読み込まれたものだからです。initTextures() メソッドに最後にロードされたテクスチャを変更すると、代わりにそのテクスチャがレンダリングされ、バインドするように指示したテクスチャが再び無視されるため、これを証明できます。私が言ったように、私はすべての PNG を複数回チェックしましたが、それらはすべて見栄えがよく、キャラクターが正しい方向を向いていることを示しています。私の loadTextureFrom(String path) メソッドは、他のテクスチャ ローダーと同じです。本当にそれについて特別なことは何もありません。私は実際に Java LWJGL / Slick-Util の 2D プロジェクトの 90% でこの正確な方法を使用していますが、最近この問題に遭遇し始めました。私は言葉を失っており、これまでこの問題に遭遇したことはありません。どんな助けでも大歓迎です。:)
編集1:
重要なテストを行ったところです。initTextures() メソッド内にそれらをロードした後、4 つのテクスチャすべての HashCode をチェックしました。
public void initTextures()
{
char_left = loadTextureFrom("character/char_l.png");
char_right = loadTextureFrom("character/char_r.png");
char_down = loadTextureFrom("character/char_d.png");
char_up = loadTextureFrom("character/char_u.png");
write(System.identityHashCode(char_left));
write(System.identityHashCode(char_right));
write(System.identityHashCode(char_down));
write(System.identityHashCode(char_up));
}
それはこれを返しました:
1364345882
1878339755
1246651385
1619367563
これは、initTextures() メソッドが問題ではないことを本当に証明していると思います。繰り返しになりますが、どんな助けでも大歓迎です!この種の 100% は、どのプロジェクトでもこれ以上仕事をするのをためらわせます :/ ありがとう! :)