Black Mamba
Black Mamba

Reputation: 13

Image not showing up on Canvas (Java)

I'm creating a game and the background and main character are not loading up. Here's where I declare the variables:

private BufferedImage background;   
private BufferedImage player;

Here's where I get the images:

try {
    background = ImageIO.read(this.getClass().getResourceAsStream("/res/Background.jpg"));
    player = ImageIO.read(this.getClass().getResourceAsStream("/res/Player.jpg"));
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

Here's my render method:

public void render() {
    BufferStrategy bs = this.getBufferStrategy();

    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();

    g.drawImage(background, 0, 0, this);
    g.drawImage(player, 0, 0, this);

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

Here's my whole class:

public class Main extends Canvas implements Runnable, KeyListener {

    Thread t;
    boolean running = false;

    private BufferedImage background;

    private BufferedImage player;

    public Main() {

        setFocusable(true);
        requestFocus();
        addKeyListener(this);

        try {
            background = ImageIO.read(this.getClass().getResourceAsStream("/res/Background.jpg"));
            player = ImageIO.read(this.getClass().getResourceAsStream("/res/Player.jpg"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    @Override
    public void run() {

        while (running) {
            tick();
            render();
        }

        stop();

    }

    synchronized void start() {

        if (running) return;
        running = true;

        Thread t = new Thread();
    t.start();

}

synchronized void stop() {
    try {
        t.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.exit(0);
}

public void render() {
    BufferStrategy bs = this.getBufferStrategy();

    if (bs == null) {
        createBufferStrategy(3);
        return;
    }

    Graphics g = bs.getDrawGraphics();

    g.drawImage(background, 0, 0, this);
    g.drawImage(player, 0, 0, this);

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

public void tick() {

}

@Override
public void keyPressed(KeyEvent e) {
    int code = e.getKeyCode();

    if (code == KeyEvent.VK_ESCAPE) {
        System.exit(0);
    }
}

@Override
public void keyReleased(KeyEvent e) {
    // TODO Auto-generated method stub

}

@Override
public void keyTyped(KeyEvent e) {
    // TODO Auto-generated method stub

}

public static void main(String[] args) {
    JFrame f = new JFrame("Mission Sahara");
    Main m = new Main();

    f.add(m);
    f.setExtendedState(JFrame.MAXIMIZED_BOTH);
    f.setUndecorated(true);
    f.setResizable(false);
    f.setVisible(true);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    m.start();
}

}

What's wrong with my code?

Upvotes: 0

Views: 217

Answers (1)

MadProgrammer
MadProgrammer

Reputation: 347204

You're creating an "empty" Thread in your start method...

Thread t = new Thread();
t.start();

which won't do a lot.

Instead, you probably want to do something like...

synchronized void start() {

    if (running) {
        return;
    }
    running = true;

    Thread t = new Thread(this);
    t.start();

}

since Main implements Runnable

Upvotes: 1

Related Questions