package gameEngine.entites.gameComponents; import gameEngine.entites.Entity; import gameEngine.entites.GameObject; import gameEngine.views.Texture; import gameEngine.views.Window; import static org.lwjgl.opengl.GL11.*; public class Mesh extends GameComponent { public enum MeshType { SPRITE, CUBE } private final MeshType type; private Texture texture; // スプライトのテクスチャを保持 private final Entity parent; // 親のオブジェクトを持つ private int spriteWidth = 64; // スプライト幅(今後指定可能にする) private int spriteHeight = 64; // スプライト高さ(今後指定可能にする) public Mesh(Entity parent, MeshType type, String texturePath) { this.parent = parent; this.type = type; if (type == MeshType.SPRITE) { this.texture = new Texture("GameEngine/resources/" + texturePath); // Load the image } } @Override public void init() { if (type == MeshType.SPRITE) { renderSprite(); // スプライトの描画 } } @Override public void update() { if (type == MeshType.SPRITE) { renderSprite(); // スプライトの描画 } } private void renderSprite() { // 2Dの描画モードに切り替え glMatrixMode(GL_PROJECTION);// 投影行列の設定モードに切り替え glPushMatrix(); // 現在の投影行列を保存 glLoadIdentity(); // 単位行列をロードして投影行列をリセット // ピクセル単位の座標系に設定 (画面左上が原点、画面サイズはWindowの幅と高さ) /* x軸: 左が0、右がWindow.get().width(ウィンドウの幅) y軸: 上が0、下がWindow.get().height(ウィンドウの高さ) z軸: -1から1の範囲で設定 */ glOrtho(0, Window.get().width, Window.get().height, 0, -1, 1); // モデルビュー行列に切り替えて、描画する位置を決める glMatrixMode(GL_MODELVIEW); // モデルビュー行列の設定モードに切り替え glPushMatrix(); // 現在のモデルビュー行列を保存 glLoadIdentity(); // 単位行列をロードしてモデルビュー行列をリセット // テクスチャをバインド (テクスチャIDをOpenGLに設定) glBindTexture(GL_TEXTURE_2D, texture.getId()); // 親のGameObjectの座標と回転を取得 float x = parent.transform.position.x; float y = parent.transform.position.y; float rotationZ = parent.transform.rotation.z; // 回転の適用 glTranslatef(x + spriteWidth / 2.0f, y + spriteHeight / 2.0f, 0); // 回転中心をスプライトの中心に glRotatef(rotationZ, 0, 0, 1); // Z軸周りに回転 glTranslatef(-(x + spriteWidth / 2.0f), -(y + spriteHeight / 2.0f), 0); // 元の位置に戻す // テクスチャの描画 glEnable(GL_TEXTURE_2D); glColor4f(1f, 1f, 1f, 1f); // テクスチャを有効にして、イメージの座標とサイズを指定 glEnable(GL_TEXTURE_2D); // テクスチャを有効化 glColor4f(1f, 1f, 1f, 1f);// 色を白に設定 (テクスチャそのままの色で表示) // 四角形を描画 (テクスチャ座標と画面座標を対応付け) glBegin(GL_QUADS); // 四角形を描画する glTexCoord2f(0, 0); glVertex2f(x, y); // 左上の頂点 (テクスチャ座標0,0と画面座標) glTexCoord2f(1, 0); glVertex2f(x + spriteWidth, y); // 右上の頂点 (テクスチャ座標1,0と画面座標) glTexCoord2f(1, 1); glVertex2f(x + spriteWidth, y + spriteHeight); // 右下の頂点 (テクスチャ座標1,1と画面座標) glTexCoord2f(0, 1); glVertex2f(x, y + spriteHeight); // 左下の頂点 (テクスチャ座標0,1と画面座標) glEnd(); // 四角形の描画を終了 // テクスチャの使用を終了 glDisable(GL_TEXTURE_2D); // テクスチャの無効化 glBindTexture(GL_TEXTURE_2D, 0); // テクスチャのバインドを解除 // 行列を元に戻す (PushしたものをPopで復元) glPopMatrix(); // モデルビュー行列を元に戻す glMatrixMode(GL_PROJECTION); // 投影行列の設定モードに切り替え glPopMatrix(); // 投影行列を元に戻す } }