0

作成中の新しいゲームでテスト テクスチャを取得しましたが、何らかの理由でそれをゲームに実装すると、テクスチャが垂直方向ではなく水平方向に反転します。なぜこれが起こるのですか?

これがアプリの写真です。

画像

ご覧のとおり、小さな男は水平に反転しており、まるで眠っているかのようです。彼は垂直に面している必要があります。なぜこれが起こっているのですか?どうすれば防止できますか? 関連する両方のクラスを投稿します。

プレイヤークラス:

   import java.io.IOException;

import org.newdawn.slick.opengl.Texture;
import org.newdawn.slick.opengl.TextureLoader;
import org.newdawn.slick.util.ResourceLoader;

public class Player {

    public Texture playerTexture;

    // Positions & speed
    public float xPos = 20.0f; // This is initial
    public float yPos = 450.0f; // Same as above.

    private float velocity = 20;

    public float gravityForce = 6;
    public float jumpVelocity = 25;

    private static int moveSpeed = 30 / 2;

    public boolean isSupported = false; // Once again, initial value. 
    boolean canJump = true;

    // movement methods

    public Texture grabTexture() {
        try {
            playerTexture = TextureLoader.
                    getTexture("PNG", ResourceLoader
                    .getResourceAsStream
                    ("resources/test_char.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return playerTexture;
    }

    public void applyGravity() {

    }

    private void printPos(String moveMethod) {
        System.out.println(moveMethod + " X: " 
    + xPos + " Y: " + yPos);
    }

    public void moveRight() {
        xPos += moveSpeed;
        printPos("Moving right!");
    }

    public void moveLeft() {
        xPos -= moveSpeed;
        printPos("Moving left!");
    }

    public void jump() {
        if (!isSupported) {

        }
    }

    public void shoot() {
        // do shooty stuff here
    }

}

メイン (ランチャー) クラス:

import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class Main {

    private void display() {
        try {
            Display.setDisplayMode(new DisplayMode(1000, 550));
            Display.setTitle("Unnamed Platformer Game");
            Display.create();
        } catch (LWJGLException e) {
            e.printStackTrace();
            System.exit(0);
        }

        // OpenGL

        while (!Display.isCloseRequested()) {
            initGL();
            player.applyGravity();
            Display.update();
            Display.sync(60); // sync to 60 fps

            if (Keyboard.isKeyDown(Keyboard.KEY_D)) {
                player.moveRight();
            } else if (Keyboard.isKeyDown(Keyboard.KEY_A)) {
                player.moveLeft();
            } else if (Keyboard.isKeyDown(Keyboard.KEY_SPACE)) {
                player.jump();
            }
        }

        Display.destroy();
    }

    private void initGL() {
        // initial OpenGL items for 2D rendering
        GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();
        GL11.glOrtho(0, 1000, 550, 0, 1, -1);


        // start rendering player image
        player.grabTexture().bind();
        GL11.glBegin(GL11.GL_QUADS);

        GL11.glVertex2f(player.xPos, player.yPos);
        GL11.glTexCoord2f(0, 0);

        GL11.glVertex2f(player.xPos + 100, player.yPos);
        GL11.glTexCoord2f(1, 0);

        GL11.glVertex2f(player.xPos + 100, player.yPos + 100);
        GL11.glTexCoord2f(1, 1);

        GL11.glVertex2f(player.xPos, player.yPos + 100);
        GL11.glTexCoord2f(0, 1);
        GL11.glEnd(); // stop rendering this image
    }

    Player player = new Player();

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

1 に答える 1

2
GL11.glVertex2f(player.xPos, player.yPos);
GL11.glTexCoord2f(0, 0);

問題は、これらの関数を順不同で呼び出していることです。を呼び出すたびにglVertex2f、OpenGL は現在設定されている属性を取得し、それを頂点に使用します。この場合、頂点を設定したにテクスチャ座標を設定しているため、座標は頂点 1 つ分「遅延」します。これらの呼び出しのすべてのペアを交換すると、機能するはずです。

また、呼び出しglOrthoで top と bottom のパラメーターが入れ替わっています。下部の値は、画面の下部にある y の値 (この場合は 0) です。トップ値も同様。

于 2013-07-18T20:24:57.530 に答える