diff --git a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java index 911b554..c0246fa 100644 --- a/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java +++ b/GameEngine/src/main/java/gameEngine/entites/gameComponents/Mesh.java @@ -23,7 +23,7 @@ this.parent = parent; this.type = type; if (type == MeshType.SPRITE) { - this.texture = new Texture("GameEngine/resources/" + texturePath); // Load the image + this.texture = new Texture(texturePath); // Load the image } } @@ -37,11 +37,16 @@ @Override public void update() { if (type == MeshType.SPRITE) { + Integer id = texture.getId(); + if(id == null){ + texture.init(); + } renderSprite(); // スプライトの描画 } } public void setTexturePath(String texturePath){ + this.texture = new Texture(texturePath); } private void renderSprite() { diff --git a/GameEngine/src/main/java/gameEngine/scenes/Scene.java b/GameEngine/src/main/java/gameEngine/scenes/Scene.java index 7bf6e67..59d3d74 100644 --- a/GameEngine/src/main/java/gameEngine/scenes/Scene.java +++ b/GameEngine/src/main/java/gameEngine/scenes/Scene.java @@ -55,7 +55,7 @@ String newId = Integer.toString(entitiesLength); GameObject newGameObject = new GameObject(newId); addEntity(newId, newGameObject); - newGameObject.addComponent(new Mesh(newGameObject, Mesh.MeshType.SPRITE, "test.png")); + newGameObject.addComponent(new Mesh(newGameObject, Mesh.MeshType.SPRITE, "GameEngine/resources/test.png")); newGameObject.setName("NewEntity" + newId); }); } diff --git a/GameEngine/src/main/java/gameEngine/views/Texture.java b/GameEngine/src/main/java/gameEngine/views/Texture.java index b7e5433..2a21dc0 100644 --- a/GameEngine/src/main/java/gameEngine/views/Texture.java +++ b/GameEngine/src/main/java/gameEngine/views/Texture.java @@ -17,9 +17,10 @@ テクスチャとして利用できるようにする */ - private int id; //OpenGLのテクスチャID + private Integer id = null; //OpenGLのテクスチャID private int width; // 読み込んだ画像の幅 private int height; // 読み込んだ画像の高さ + private ByteBuffer pixels; public Texture(String path) { BufferedImage bi; @@ -35,7 +36,7 @@ int[] pixelsRaw = bi.getRGB(0, 0, width, height, null, 0, width); //BufferUtils.createByteBuffer(width * height * 4): OpenGLに送信するためのバッファ(ByteBuffer)を作成 - ByteBuffer pixels = BufferUtils.createByteBuffer(width * height * 4); + pixels = BufferUtils.createByteBuffer(width * height * 4); // 各ピクセルを取り出し、色成分(R, G, B, A)を抽出してByteBufferに格納 // (pixel >> 16) & 0xFF: ピクセルデータの上位16ビットを右にシフトし、赤色成分を抽出。 @@ -49,33 +50,37 @@ pixels.put((byte) ((pixel >> 24) & 0xFF)); // Alpha } } + // ByteBufferを読み込み可能な状態に pixels.flip(); - // 新しいテクスチャIDを生成 - id = glGenTextures(); - - // 生成したテクスチャIDを現在のテクスチャとしてバインド - // 以降のテクスチャ関連の操作はこのテクスチャに対して行われる - glBindTexture(GL_TEXTURE_2D, id); - - // テクスチャデータをOpenGLに送信 - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); - - //テクスチャのフィルタリング方法を設定 - //ニアレストフィルタリング:拡大縮小時のぼやけがなくなる - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - - // テクスチャのバインディングを解除 - glBindTexture(GL_TEXTURE_2D, 0); - } catch (IOException e) { e.printStackTrace(); } } - public int getId() { + public void init(){ + + // 新しいテクスチャIDを生成 + id = glGenTextures(); + + // 生成したテクスチャIDを現在のテクスチャとしてバインド + // 以降のテクスチャ関連の操作はこのテクスチャに対して行われる + glBindTexture(GL_TEXTURE_2D, id); + + // テクスチャデータをOpenGLに送信 + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, pixels); + + //テクスチャのフィルタリング方法を設定 + //ニアレストフィルタリング:拡大縮小時のぼやけがなくなる + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + // テクスチャのバインディングを解除 + glBindTexture(GL_TEXTURE_2D, 0); + } + + public Integer getId() { return id; } diff --git a/GameEngine/src/main/java/gameEngine/views/Window.java b/GameEngine/src/main/java/gameEngine/views/Window.java index 6322617..545ddd8 100644 --- a/GameEngine/src/main/java/gameEngine/views/Window.java +++ b/GameEngine/src/main/java/gameEngine/views/Window.java @@ -36,6 +36,7 @@ this.height = 900; this.title = "HelloWorld"; gameEditor = new GameEditor(); + init(); } public static void changeScene(int newScene) { @@ -87,7 +88,6 @@ public void run() { System.out.println("Hello LWJGL " + Version.getVersion() + "!"); - init(); loop(); glfwFreeCallbacks(glfwWindow); glfwDestroyWindow(glfwWindow);