Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OpenGL纹理朝向错误方向的问题_Java_Opengl_Lwjgl_Textures - Fatal编程技术网

Java OpenGL纹理朝向错误方向的问题

Java OpenGL纹理朝向错误方向的问题,java,opengl,lwjgl,textures,Java,Opengl,Lwjgl,Textures,我在一个新游戏中创建了一个测试纹理,出于某种原因,当我在游戏中实现它时,纹理是水平翻转的,而不是垂直翻转的。为什么会发生这种情况 这是应用程序的照片 正如你所看到的,这个小家伙被水平翻转,几乎就像在睡觉一样。他应该垂直面对。为什么会发生这种情况,我该如何防止?我将发布两个涉及的类 球员级别: import java.io.IOException; import org.newdawn.slick.opengl.Texture; import org.newdawn.slick.open

我在一个新游戏中创建了一个测试纹理,出于某种原因,当我在游戏中实现它时,纹理是水平翻转的,而不是垂直翻转的。为什么会发生这种情况

这是应用程序的照片

正如你所看到的,这个小家伙被水平翻转,几乎就像在睡觉一样。他应该垂直面对。为什么会发生这种情况,我该如何防止?我将发布两个涉及的类

球员级别:

   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();
    }
}
主(启动器)类:

问题是您调用这些函数的顺序不正确。无论何时调用
glVertex2f
,OpenGL都将获取当前设置的任何属性,并将其用于顶点。在本例中,您将在设置顶点后设置纹理坐标,因此坐标“延迟”一个顶点。如果你交换每一对这样的呼叫,它应该可以工作


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

Post
test\u char.png
。据我们所知,这个小家伙可能在磁盘的侧面。你的
nearVal
farVal
glOrtho的参数可能是向后的。@genpfault你可以在resources@genpfault下找到他,他是40x40,btw@DrewMcGowen我不这么认为。非常非常接近。你可以翻转纹理,只是方式不对。纹理现在是垂直的,但它是颠倒的。你说的几乎所有东西都起作用了,但纹理仍然没有翻转。这些都是对代码的重大更改,只有像我这样的初学者才能做到,但纹理仍然没有固定。如果交换顶部/底部参数不会翻转纹理,我不确定问题出在哪里(可能是纹理类将其倒置加载)。不知道。现在,我把他倒过来重新粉刷,解决了这个问题。可能是个坏主意,但我暂时不谈。@hasherr:使用通常的转换设置,OpenGL将纹理图像原点放在左下角。但是大多数图像文件格式将原点放在左上角。这种组合使它看起来“颠倒”。
GL11.glVertex2f(player.xPos, player.yPos);
GL11.glTexCoord2f(0, 0);