Skip to main content
GameDev.net gamedev.net
🔒 Locked

Drawing Images to a BufferStrategy

Started by destructivArts Apr 29, 2012 at 2:57 AM 5 replies 2.9k views
Original Post
destructivArts
destructivArts
Hi All! It seems like I've been posting on here a lot lately so let me start by saying Thank you to everyone who has helped me lately!
Now, my latest problem:
I'm using a BufferStrategy in Java to draw directly on a JFrame. The Frame displays and I can draw shapes on it. However, any call to g.drawImage(); (g being a Graphics object) doesn't do anything. I'm not sure what's happening. The code seems to be getting passed over, because I've put print statements before and after it and they both get printed.

Here's the important snippets of code:
This code actually calls the other objects Draw Functions

private void drawImage(){
BufferStrategy bf = this.getBufferStrategy();
Graphics g = null;

try{
g = bf.getDrawGraphics();

//Pass off Graphics to each object so it can draw itself
mmenu.drawMenu(g);
}finally{
g.dispose();
}

bf.show();
Toolkit.getDefaultToolkit().sync();
}

And this is the draw method of the menu object (mmenu) and it's constructor

private Image bg;

public MainMenu(String bg){
this.bg = Toolkit.getDefaultToolkit().getImage(bg);
}
public void drawMenu(Graphics g){
g.drawImage(bg,100,100,null);
}
-------------------------------------
"Other than that, I have no opinion."
My Blog - Check it Out
kyanite
kyanite
Both Toolkit and Graphics2D are designed to fail silently, which is why you have no indication of a problem other than the image simply not showing. The most likely culprit is the image itself - a bad filename or a large image that AWT loads too slowly to be presented immediately are pretty common. You need to check that the image's dimensions are not (-1, -1) via getWidth(null) and getHeight(null). E.g.:


public void drawMenu(Graphics g){
if((image == null) || (image.getWidth(null) == -1 || image.getHeight(null) == -1))
throw new RuntimeException("The image wasn't loaded correctly.");
// ...
}
destructivArts
destructivArts
Ok, its definitely something to do with that. I don' think it's size because I've loaded this image into Java the exact same way before. I'm using NetBeans to write this code, and it's building the files in a different location than the java files. They look identical though. ie. the path to the resource is the same in both places. Could it also have something to do with the fact that in NetBeans the java/class files are in one package and the images are in a sub package. ie. platform.game has all the java files, while platform.game.Assets.Backgrounds has the image I want.
-------------------------------------
"Other than that, I have no opinion."
My Blog - Check it Out
JuliusDegutis
JuliusDegutis
Maybe it will help

//loading image
void loadImages() {
bg = new ImageIcon(this.getClass().getResource("background.png")).getImage();
}

//drawing image
void draw(Graphics2D g2d) {
g2d.drawImage(bg, 0, 0, null);
}

//this one on init to create shit
void init()P
createBufferStrategy(2);
strategy = getBufferStrategy();
g2d = (Graphics2D) strategy.getDrawGraphics();
}

//this one has more code, bet important is this piece of code
private void graphics() {
strategy = getBufferStrategy();
g2d = (Graphics2D) strategy.getDrawGraphics();
strategy.show();
}
//and in game loop I draw it
private void gameLoop() {
while (running){
graphics();
draw(g2d);
g2d.dispose();
}
}

destructivArts
destructivArts
Ok, Most of that makes sense. What's the difference between Image and ImageIcon? also, How do I set resources for each class? Other than that, I'm doing most of the other stuff already.
-------------------------------------
"Other than that, I have no opinion."
My Blog - Check it Out
JuliusDegutis
JuliusDegutis
Difference don't know, but my code works All images is in src folder, and can easily simple get by name (as in my code). If you wanna I can send you my whole project, if you willing to read a lot of code I programmed in netbeans too
kyanite
kyanite
Could it also have something to do with the fact that in NetBeans the java/class files are in one package and the images are in a sub package. ie. platform.game has all the java files, while platform.game.Assets.Backgrounds has the image I want[/quote]

If you have your media embedded in a package, then you need to use getResource(URL) to access it from within the archive. E.g.

public MainMenu(String bg){
// the "/" character specifies the root of your package hierarchy
final URL myURL = MainMenu.class.getResource("/platform/game/Assets/Backgrounds/myImage.jpg");
this.bg = Toolkit.getDefaultToolkit().getImage(myURL);
}


The other way to resolve this is to move your image directory outside your package structure. E.g.

Root Directory

  • platform

    • game
    • assets

      • backgrounds


        Netbeans should easily allow you to create additional folders. I also created a simple example to test this (BufferStrategy + Image loading) and it worked fine.

        Edit: Fixed path.

Topic Locked

This topic has been locked by a moderator. New replies are not allowed.

Sign in to reply to this topic.