128 x 128 のテクスチャが 164 x 128 で描画されるという問題があります。または 100x100 が 128x100 で描画されます。何日もデバッグしようとしてきました:私がより多くの髪を抜くのを救うために助けてくれてとても感謝しています:)
私は Kevin Glass の Space Invaders 104 LWJGL コードを参照として使用しています (読み取り: コピー/貼り付け/変更/学習!)。 ただし、複数のレンダリング方法は必要ありません: GL に LWJGL を使用するだけで垂直スクロール シューティング ゲームを構築しています。グラフィックスとキーボード制御。
問題はすべての「スプライト」で発生しているようですが、プレイヤー船のスプライトに焦点を合わせてデバッグしているので、ここで例として使用します。スクリーンショットで確認すると、使用されている元の PNG 画像のピクセルよりも広いスプライトを描画しています。最初は、おそらくコードには 2^n 値の画像が必要だと思ったので、ソースを 128 x 128 ピクセルの画像に更新しました。これは 164 x 128 で描画されています。画像を 100 x 100 として再作成し、描画します128 x 100 として...少なくとも一貫した比率が発生しています! その比率と、毎回正しい Y を描画するという事実から、単純なエラーまたはどこかのタイプミスだと思い込んでいました...
したがって、最初に焦点を当てたのは、次のコードです。
public void draw(int x, int y) {
// store the current model matrix
GL11.glPushMatrix();
// bind to the appropriate texture for this sprite
texture.bind();
// translate to the right location and prepare to draw
GL11.glTranslatef(x, y, 0);
GL11.glColor3f(1,1,1);
// draw a quad textured to match the sprite
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0, 0);
GL11.glVertex2f(0, 0);
GL11.glTexCoord2f(0, texture.getHeight()); // texture.getHeight() returns 1.0, confirmed while debugging
GL11.glVertex2f(0, height); // height = 128px, confirmed while debugging
GL11.glTexCoord2f(texture.getWidth(), texture.getHeight());
GL11.glVertex2f(width,height); // width = 128px, confirmed while debugging
GL11.glTexCoord2f(texture.getWidth(), 0);
GL11.glVertex2f(width,0);
}
GL11.glEnd();
// restore the model view matrix to prevent contamination
GL11.glPopMatrix();
}
私はこのコードを最もデバッグしました。これが「魔法が起こる場所」であると考えて、必要に応じて glVertex2f に 128px を確実に渡し、必要に応じて glTexCoord2f が比率 1.0 を取得していることを確認します。したがって、私の論理は、与えられた GL は 3D に対応しており、おそらく座標と実際のピクセルの間に何らかの抽象化がある (ST 対 XY? おそらくゴミを話している...) 多分それは「キャンバス」または「ディスプレイ」自体ではないということです。きちんと設定?ゲームの世界/GL の世界では、現実の世界が 800 ピクセルの高さで描画されている場合、世界は 1000 ピクセルの高さであると見なされるため、物事は垂直に押しつぶされますか? したがって、私の GL 初期化コードは (Glass のコメントを含む!):
public void startRendering() {
try {
setDisplayMode();
Display.create();
// grab the mouse, dont want that hideous cursor when we're playing!
Mouse.setGrabbed(true);
// enable textures since we're going to use these for our sprites
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
// disable the OpenGL depth test since we're rendering 2D graphics
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glOrtho(0, GAMESIZE_X, GAMESIZE_Y, 0, -1, 1);
} catch (LWJGLException le) {
System.exit(0);
}
initialise();
GameLoop();
}
private boolean setDisplayMode() {
try {
// get modes
DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(
GAMESIZE_X, GAMESIZE_Y, -1, -1, -1, -1, 60, 60);
org.lwjgl.util.Display.setDisplayMode(dm, new String[] {
"width=" + GAMESIZE_X,
"height=" + GAMESIZE_Y,
"freq=" + 60,
"bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() });
return true;
} catch (Exception e) {
e.printStackTrace();
System.out.println("Unable to enter fullscreen, continuing in windowed mode");
}
return false;
}
そこには完全には理解できないコードがたくさんありますが、問題に影響を与えると思われるものを直感的に見ることはできませんか? 私の正しいゲームサイズは、一見すべての関連するポイントで渡されています。