Обрежьте текстуру до текстуры меньшего размера, используя slick и lwjgl (JAVA) - PullRequest
0 голосов
/ 21 октября 2018

Ниже я написал метод рисования текстуры, заданной в ее параметрах.

    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();
}

Я не хочу менять ЭТОТ метод.Вместо этого я хотел бы создать метод, который обрезает спрайт-лист любого размера и может содержать любое количество обрезков, которые мне может потребоваться сохранить в виде отдельных текстур.

Ранее я использовал 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 голосов
/ 21 октября 2018

Хорошо получается, что в slick есть встроенная функция BufferedImageUtil, которая преобразует буферизованные изображения в текстуру.Это простой ответ, вместо того, чтобы пытаться создать что-то, что получает subImage, как в 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;
}

}
...