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 将获取当前设置的任何属性并将其用于顶点。在这种情况下,您是在设置顶点之后设置纹理坐标,因此坐标会“延迟”一个顶点。如果你交换每一对这些调用,它应该可以工作。

此外,您的调用glOrtho交换了顶部和底部参数。底部值是屏幕底部的 y 值(在本例中为 0)。对于最高价值也是如此。

于 2013-07-18T20:24:57.530 回答