使用光滑和lwjgl(JAVA)将纹理裁剪为较小的纹理

时间:2018-10-21 16:36:15

标签: java lwjgl crop slick

下面,我写了一种方法来绘制其参数中给出的纹理。

    public void drawImage(Texture texture, int x, int y, int width, int height) {
    texture.bind();
    glTranslatef(x, y, 0);
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0);
    glTexCoord2f(1, 0);
    glVertex2f(width, 0);
    glTexCoord2f(1, 1);
    glVertex2f(width, height);
    glTexCoord2f(0, 1);
    glVertex2f(0, height);
    glEnd();
    glLoadIdentity();
}

我不想更改此方法。相反,我想做的是创建一种方法,该方法可以裁剪大小不等且可能需要保存为单独纹理的任意数量作物的Sprite Sheet。

以前,我使用Java.AWT来执行此操作。请参见下面的代码。注意:工作表的类型为BufferedImage。

public BufferedImage crop(int x, int y, int width, int height){
    return sheet.getSubimage(x*width, y*height, width, height);
}    

我正在尝试为上述方法找到等效的代码,该代码可以采用任意大小的一种纹理,裁剪出任何区域并将该区域作为其自己的纹理返回。

我并没有尝试更改drawImage方法,因为我确实需要使用该方法。

谢谢

1 个答案:

答案 0 :(得分:0)

结果证明,有一个名为BufferedImageUtil的内置函数,可以将缓冲的图像转换为纹理。这是一个简单的答案,而不是尝试使像BufferedImage这样的子图像变得更漂亮,更聪明的方法是将BufferedImage转换为我已经尝试了大约3个月的纹理。

对于任何尝试这种转换的人,只需使用下面的代码即可。

    SpriteSheet Tiles = new SpriteSheet(ImageLoader.loadImage("/res/Tiles.png"));
    BufferedImage test = Tiles.crop(0, 0, 64, 64);
    Texture test2 = null;
    try {
        test2 = BufferedImageUtil.getTexture("", test);                             
    } catch (IOException e) {
        e.printStackTrace();
    }
    g.drawImage(test2, 0, 0, 64, 64);

SpriteSheet类:

import java.awt.image.BufferedImage;
/**
 * This Class is responsible for splitting up sprite sheets into multiple images.
 * @author Kenneth
 *
 */
public class SpriteSheet {

private BufferedImage sheet;
/**
 * This constructor receives the image that needs to be modified.
 * @param sheet
 */
public SpriteSheet(BufferedImage sheet){
    this.sheet = sheet;
}
/**
 * This crops a sprite sheet to get the subimage within the picture.
 * @param x
 * @param y
 * @param width
 * @param height
 * @return
 */
public BufferedImage crop(int x, int y, int width, int height){
    return sheet.getSubimage(x*width, y*height, width, height);
}
}

ImageLoader:

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
/**
 * This class is responsible for loading in images
 * @author Kenneth
 *
 */
public class ImageLoader {
/**
 * This method tries to load in the selected image from the path given.
 * @param path
 * @return
 */
public static BufferedImage loadImage(String path){
    try {
        return ImageIO.read(ImageLoader.class.getResource(path)); //Loads in image
    } catch (IOException e) {
        e.printStackTrace();
        System.exit(1); //If the image cannot be loaded, the window closes
        System.err.println(path + " was not loaded.");
    }
    return null;
}

}