0

LWJGL を使い始めたばかりで、単純な 2D プラットフォーム ゲームを作成しようとしています。現時点で議論している問題は、テクスチャの読み込みです。問題は、すべてのテクスチャ ロード関連メソッドをメイン メソッドのクラスに保持している限り、すべてがうまく機能することです。

メソッドをメソッドTextureHandlerに追加した場合にのみ、別のクラスに移動するとすぐに機能しません。問題は、私が知る限り、フレームごとに新しいオブジェクトを作成し続けることです。私は何時間もグーグルで検索しましたが、一生解決策を見つけることができません。loadTexture()drawTexture()

メインクラス:

public class Main {
    String playerPath = "res/PlayerNeutral.png";

    public void render() {
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT);
    }

    public void initGL() {
        try {
            Display.setDisplayMode(new DisplayMode(800, 600));
            Display.create();
            Display.setVSyncEnabled(true);
        }
        catch (LWJGLException e) {
            e.printStackTrace();

            System.exit(0);
        }

        // Initiating OpenGL
        GL11.glViewport(0, 0, 800, 600);
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glEnable(GL11.GL_TEXTURE_2D);

        GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

        // Enables the Alpha Blending
        GL11.glEnable(GL11.GL_BLEND);
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

        GL11.glMatrixMode(GL11.GL_MODELVIEW);

        GL11.glOrtho(0, 800, 0, 600, 1, -1);
        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    }

    public void start() {
        initGL();

        TextureHandler.loadTexture(Player.playerText, playerPath);

        while (!Display.isCloseRequested()) {
            render();
            TextureHandler.drawTexture(Player.playerText, playerPath);          
            Display.update();
        }

        Display.destroy();      
    }

    public static void main(String[] args) {
        Main test = new Main();
        test.start();
    }

TextureHandler クラス:

public class TextureHandler {
    public static void textRelease(Texture text){
        text.release();
    }

    public static void loadTexture(Texture texture, String path){
        try {
            texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(path));

            System.out.println("Texture loaded: "+texture);
            System.out.println(">> Image width: "+texture.getImageWidth());
            System.out.println(">> Image height: "+texture.getImageHeight());
            System.out.println(">> Texture width: "+texture.getTextureWidth());
            System.out.println(">> Texture height: "+texture.getTextureHeight());
            System.out.println(">> Texture ID: "+texture.getTextureID());

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

    public static void drawTexture(Texture texture, String path) {
        try {
            texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(path));

            System.out.println("Texture loaded: "+texture);
            System.out.println(">> Image width: "+texture.getImageWidth());
            System.out.println(">> Image height: "+texture.getImageHeight());
            System.out.println(">> Texture width: "+texture.getTextureWidth());
            System.out.println(">> Texture height: "+texture.getTextureHeight());
            System.out.println(">> Texture ID: "+texture.getTextureID());
        } catch (IOException e) {
            e.printStackTrace();
        }

        Color.white.bind();
        texture.bind();

        GL11.glBegin(GL11.GL_QUADS);
            GL11.glTexCoord2f(0, 1);
            GL11.glVertex2f(100, 100);
            GL11.glTexCoord2f(1, 1);
            GL11.glVertex2f(100+texture.getTextureWidth(), 100);
            GL11.glTexCoord2f(1, 0);
            GL11.glVertex2f(100+texture.getTextureWidth(), 100+texture.getTextureHeight());
            GL11.glTexCoord2f(0, 0);
            GL11.glVertex2f(100, 100 + texture.getTextureHeight());
        GL11.glEnd();

        texture.release();
    }
}

プレイヤークラス:

public class Player {
    private int x;//x pos on screen
    private int y;//y pos on screen
    public static Texture playerText;

    // method for moving the player object around
    public void move() {
        if (Keyboard.isKeyDown(Keyboard.KEY_RIGHT))
            x++;
        if (Keyboard.isKeyDown(Keyboard.KEY_LEFT))
            x--;
        if (Keyboard.isKeyDown(Keyboard.KEY_UP))
            y++;
        if (Keyboard.isKeyDown(Keyboard.KEY_DOWN))
            y--;
    }
}
4

1 に答える 1

0

これは、drawTexture()メソッドで次のことを行うためです。

try {
    texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(path));

    System.out.println("Texture loaded: "+texture);
    System.out.println(">> Image width: "+texture.getImageWidth());
    System.out.println(">> Image height: "+texture.getImageHeight());
    System.out.println(">> Texture width: "+texture.getTextureWidth());
    System.out.println(">> Texture height: "+texture.getTextureHeight());
    System.out.println(">> Texture ID: "+texture.getTextureID());
} catch (IOException e) {
    e.printStackTrace();
}

drawTexture()メソッドから上記のコードを削除するだけです。

loadTexture()レンダリング ループに入る前に、メソッドを呼び出して既に一度行っているため、テクスチャは引き続き読み込まれます。

編集

私はすでにそれを試したことがあると確信しています。それなしでは機能しないので、そこに入れたことを覚えておきたいのですが、もしそうなら「クイックフィックス」です。

あなたが言ったように、私は何かに気づきました。あなたのloadTexture()やり方は的外れです。それはおそらく、そのようなことができないことを知らないからです。

Java では、参照は値によって渡されます。つまり、メソッドを介して変数を渡すと、その変数はメソッドのローカル変数になります。したがって、メソッド内の変数を変更しても、元の変数は変更されません。

次の例を理解していただければ幸いです。変数に何か新しいものを割り当てたい場合、メソッドを介して渡された変数を使用してそれを行うことはできません。返品してから割り当てる必要があります。

public class PassingVariables {
    public static void main(String[] args) {
        String s = "Hello World!";

        System.out.println(s); // Prints | Hello World!

        test1(s);

        System.out.println(s); // Prints | Hello World!

        s = test2(s);

        System.out.println(s); // Prints | Testing...

        s = test3(s);

        System.out.println(s); // Prints | Hello World!
    }

    private static String test1(String s) {
        System.out.println(s); // Prints | Hello World!

        s = "Testing...";

        System.out.println(s); // Prints | Testing...
    }

    private static String test2(String s) {
        System.out.println(s); // Prints | Hello World!

        return "Testing...";
    }

    private static String test3(String s) {
        System.out.println(s); // Prints | Testing...

        return "Hello World!";
    }
}

新しいコード

上記のことを念頭に置いて動作するように、いくつかの変更を加えたコードを次に示します。

public static Texture loadTexture(String path) {
    Texture texture = null;

    try {
        texture = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(path));

        /* Removed all your println to spare some lines in the answer */

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

    return texture;
}

public static void drawTexture(Texture texture) {
    Color.white.bind();
    texture.bind();

    GL11.glBegin(GL11.GL_QUADS);
        GL11.glTexCoord2f(0, 1);
        GL11.glVertex2f(100, 100);
        GL11.glTexCoord2f(1, 1);
        GL11.glVertex2f(100+texture.getTextureWidth(), 100);
        GL11.glTexCoord2f(1, 0);
        GL11.glVertex2f(100+texture.getTextureWidth(), 100+texture.getTextureHeight());
        GL11.glTexCoord2f(0, 0);
        GL11.glVertex2f(100, 100 + texture.getTextureHeight());
    GL11.glEnd();

    /* 
     * I don't recognize the release() method, but if it deletes the texture
     * then remove if. If it simply unbinds the texture then keep it. If it
     * does remove it, then change it to something like unbind(), if such
     * method exist.
     */
    texture.release();
}

public void start() {
    initGL();

    Player.playerText = TextureHandler.loadTexture(playerPath);

    while (!Display.isCloseRequested()) {
        render();
        TextureHandler.drawTexture(Player.playerText, playerPath);          
        Display.update();
    }

    Display.destroy();      
}
于 2013-11-08T05:15:29.570 に答える