图像无法渲染(JAVA)

时间:2018-02-19 03:34:45

标签: java image canvas runnable buffered

所以,今天我决定尝试在不使用教程的情况下制作自己的游戏,如果我遇到问题,请尝试自己解决。但是,这个问题是我不明白的。

这是我的代码: 游戏类(应该呈现图像的位置):

public class Game extends Canvas implements Runnable {
private static final long serialVersionUID = 1L;

private int width = 350;
private int height = 200;
private int scale = 3;

private Dimension size = new Dimension(width * scale, height * scale);

private Thread thread;
private boolean running = false;

private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();

private Loader loader;

public Game() {
    JFrame frame = new JFrame("Game");

    frame.setPreferredSize(size);
    frame.setMaximumSize(size);
    frame.setMinimumSize(size);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setResizable(false);
    frame.add(this);
    frame.setVisible(true);

    loader = new Loader();
}

public static void main(String[] args) {    
    Game game = new Game();
    game.start();

    new Images();
}

public void render() {
    BufferStrategy bs = super.getBufferStrategy();
    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();
    g.drawImage(Images.TEST, 10, 10, null);

    g.dispose();
    bs.show();
}

public synchronized void start() {
    if (running)
        return;
    else
        running = true;

    thread = new Thread(this);
    thread.start();
}

public synchronized void stop() {
    if (!running)
        return;
    else
        try {
            thread.join();
        } catch (Exception e) {
            e.printStackTrace();
        }
}

@Override
public void run() {

}

public int getWidth() {
    return width;
}

public int getHeight() {
    return height;
}

public int getScale() {
    return scale;
}

}

Loader类(我加载图片的地方):

public class Loader {

public BufferedImage loadImage(String fileName) {
    try {
        System.out.println("Trying to load: " + fileName + " ... succeded!");
        return ImageIO.read(new File(fileName));
    } catch(Exception e) {
        e.printStackTrace();
    }
    System.out.println("Trying to load: " + fileName + " ... failed!");
    return null;
}

}

我的图像类,所有图像都设置为文件:

public class Images {

public static Loader loader;

public static final BufferedImage TEST;


static {
    Loader loader = new Loader();

    TEST = loader.loadImage("res/test.png");
}

}

我想做的只是简单地在屏幕上显示图像,但这种方法似乎不起作用。我不知道我做错了什么。 并且,不,我没有放入图像的错误目录。 提前谢谢!

1 个答案:

答案 0 :(得分:0)

由于run为空,因此没有任何内容正在执行更新/绘制周期。首先更新run方法以执行调用render ...

@Override
public void run() {
    while (running) {
        render();
    }
}

BufferStrategy的要点是控制绘画过程,所以你现在要负责执行它

接下来,摆脱getWidthgetHeight,这将导致问题没有结束,我浪费时间试图弄清楚为什么它没有显示我的完整图像。

以下......

frame.setPreferredSize(size);
frame.setMaximumSize(size);
frame.setMinimumSize(size);

是一个坏主意,因为框架包含窗口装饰,因此您可用的内容大小将减少窗口装饰的大小,这可能是您不希望的。

相反,请将其替换为......

@Override
public Dimension getPreferredSize() {
    return size;
}

并在窗口上调用pack以围绕所需的内容大小打包窗口装饰。

不要让我开始frame.setResizable(false);

TEST = loader.loadImage("res/test.png");让我担心。如果res/test.png嵌入在您的应用程序Jar中,则加载过程将失败。如果它已外部化到磁盘,那么如果工作目录与安装目录不同,那么加载图像会出现问题 - 只需要警告