我目前正在尝试使用包含LWJGL的Java项目。 到目前为止,我的“游戏”到目前为止我正在将图像绘制到屏幕上。
我遇到的问题是绘制的图像被绘制成黑框,而不是正确的大小。
这是一个视觉上看起来如何的图像。
以下是实际红色方形图像的样子:
这是我用OpenGL渲染的代码,我无法弄清楚我做错了什么。
public class Renderer {
//Integers used for player cordinates, Taken from player class by using Static variables
int playerX;
int playerY;
SpriteSheetLoader spriteLoader;
Texture player;
public Renderer(){
}
public void initRenderer(){
//Initialize OpenGL
GL11.glMatrixMode(GL11.GL_PROJECTION);
GL11.glLoadIdentity(); // Resets any previous projection matrices
GL11.glOrtho(0, 800, 600, 0, 1, -1);
GL11.glMatrixMode(GL11.GL_MODELVIEW);
try {
player = TextureLoader.getTexture("PNG",ResourceLoader.getResourceAsStream("res/PaddleTemp.png"));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void update(){
GL11.glClear( GL11.GL_COLOR_BUFFER_BIT | GL11.GL_DEPTH_BUFFER_BIT );
playerX = Player.playerX; //Gets player x and y from the player class using static variables
playerY = Player.playerY;
player.bind();
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0); //top left
GL11.glVertex2f(playerX, playerY);
GL11.glTexCoord2f(1,0); //Top right
GL11.glVertex2f(playerX + 50, playerY);
GL11.glTexCoord2f(1, 1); //Bottom right
GL11.glVertex2f(playerX + 50, playerY + 150);
GL11.glTexCoord2f(0, 1); //bottom left
GL11.glVertex2f(playerX, playerY + 150);
GL11.glEnd();
}
答案 0 :(得分:1)
抱歉,我不能确定问题是什么。不幸的是,我似乎无法在之后重现它。但我认为它应该通过以下之一解决:
OpenGL在很大程度上依赖于这样的图像,其分辨率的宽度和高度是2的幂(宽度/高度= n * 2时)。如果图像文件不符合该规范,LWJGL可能会表现得很奇怪。此外,不要担心图像文件被压扁。这取决于顶点输入,而不是纹理输入。
尝试将图像文件保存为非隔行扫描PNG文件。 Slick_Util或用于加载图像文件的任何内容可能无法完全支持您提供给它的图像。
作为最后的手段,您可以在初始化代码中添加以下代码行:
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
希望其中一个技巧可以帮到你。
答案 1 :(得分:1)
我有一个非常简单的解决方案。您的主要问题是您使用的是不受支持的图像大小,但只要将精灵的实际大小扩展为正确,OpenGL就会很好。它还记录图像宽度和高度的确切浮点值,以便您实际上可以使用任何您想要的大小的图像。只需用以下代码替换当前的渲染代码:
GL11.glBegin(GL11.GL_QUADS);
GL11.glTexCoord2f(0, 0); //top left
GL11.glVertex2f(playerX, playerY);
GL11.glTexCoord2f(player.getWidth(),0); //Top right
GL11.glVertex2f(playerX + 50, playerY);
GL11.glTexCoord2f(player.getWidth(), player.getHeight()); //Bottom right
GL11.glVertex2f(playerX + 50, playerY + 150);
GL11.glTexCoord2f(0, player.getHeight()); //bottom left
GL11.glVertex2f(playerX, playerY + 150);
GL11.glEnd();
另外,你可以忽略另一个答案,因为这个应该是你的解决方案。