2014-01-09 3 views
1

В настоящее время я пытаюсь создать игру для класса, и я решил попробовать загрузить графический интерфейс и отобразить фоновое изображение.GUI продолжает сбой из-за загрузки изображения?

Однако я решил создать одноэлементный ImageLoader-класс с HashMap, который кэширует уже загруженные изображения и сохраняет и/или возвращает новые BufferedImages. Основная цель этого - легко и эффективно получить доступ к спрайтам для нескольких вражеских объектов/ракет, которые будут реализованы в ближайшее время.

Теперь класс игры не является полным, но он должен бежать, что он и делает! Просто не так, как я ожидал.

Я бы ожидал, что он запустится и отобразит графический интерфейс с фоновым изображением, но графический интерфейс отобразится на долю секунды, а затем сработает.

Вот класс игры (рисунок изображения в в методе runGameLoop)

import java.awt.Canvas; 
import java.awt.Graphics2D; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 

public class Game extends Canvas{ 

private JFrame frame; 
private BufferStrategy strat; 
private boolean stillPlaying; 


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

    frame.addWindowListener(new WindowAdapter() { 
     public void windowClosing(WindowEvent e) { 
      System.exit(0); 
     } 
    }); 

    frame.getContentPane().add(this); 
    setIgnoreRepaint(true); 
    frame.setSize(800,600); 
    setBounds(0,0,800,600); 
    frame.pack(); 
    frame.setResizable(false); 
    frame.setVisible(true); 
    this.createBufferStrategy(2); 
    strat = getBufferStrategy(); 
    stillPlaying = true; 
} 

public static void main(String[] args) { 
    Game g = new Game(); 
    g.runGameLoop(); 
} 

private void runGameLoop() { 
    long initLoop = System.currentTimeMillis(); 
    //while(stillPlaying){ 
     long change = initLoop - System.currentTimeMillis(); 
     initLoop = System.currentTimeMillis(); 
     Graphics2D gfx = (Graphics2D) strat.getDrawGraphics(); 
     BufferedImage sourceImage = ImageLoader.getImageLoader().getImage("resources/Untitled.jpg"); 
     gfx.drawImage(sourceImage,0,0,null); 
    //} 
} 

} 

А вот класс ImageLoader

import java.awt.image.BufferedImage; 
import java.net.URL; 
import java.util.HashMap; 

import javax.imageio.ImageIO; 


public class ImageLoader { 

private HashMap<String,BufferedImage> storedImages = new HashMap<String,BufferedImage>(); 
private static ImageLoader single = new ImageLoader(); 

public static ImageLoader getImageLoader() { 
    return single; 
} 

public BufferedImage getImage(String place) { 
    BufferedImage image=null; 
    if (storedImages.containsKey(place)) 
     return storedImages.get(place); 
    else{ 
     try{ 
      URL location = this.getClass().getClassLoader().getResource(place); 
      if(location == null) 
       System.exit(0); 

      image = ImageIO.read(location); 
     } 
     catch(Exception e){ 
      System.out.println(e); 
      System.exit(0); 
     } 

     storedImages.put(place,image); 
     return storedImages.get(place); 
    } 
} 


} 

Спасибо за любую помощь ! Я открыт для критики.

+0

Я подозреваю, что ваши изображения не там, где вы думаете, что они ... – MadProgrammer

+0

Что врезаться? Исключение? Каково исключение, трассировка стека и строка в этих файлах, где трассировка стека относится к ... –

+0

В вашем улове выньте 'System.exit' и замените SOP на' ex.printStackTrace(). 'Смотрите, что вы получаете –

ответ

2

Вы должны быть в том же пакете, что и класс, пытающийся их загрузить. Простое исправление - просто скопировать все изображения (если вы используете IDE), щелкните правой кнопкой мыши на пакете и вставьте. До тех пор, пока вы просто используете имя файла изображения как путь, то есть «mypic.png», он должен работать нормально.


EDIT

Так что я получил его на работу, чтобы остановить закрытие. Все, что я сделал это изменить

URL location = this.getClass().getClassLoader().getResource(place); 

К

URL location = this.getClass().getResource(place); 

Единственная проблема, это изображение не красил. Я не совсем уверен, как работает Canvas, это AWT, я действительно очень хорошо знаком с Swing, поэтому я изменил его на JPanel и переопределил метод paintComponent. И сделал еще несколько тонких изменений. Вы можете проверить это. Дайте знать, если у вас появятся вопросы.

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.awt.image.BufferStrategy; 
import java.awt.image.BufferedImage; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Game extends JPanel { 

    private JFrame frame; 
    private BufferStrategy strat; 
    private boolean stillPlaying; 

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

     frame.addWindowListener(new WindowAdapter() { 
      public void windowClosing(WindowEvent e) { 
       System.exit(0); 
      } 
     }); 

     frame.getContentPane().add(this); 
     setIgnoreRepaint(true); 
     frame.pack(); 
     frame.setResizable(false); 
     frame.setVisible(true); 
     stillPlaying = true; 
    } 

    public static void main(String[] args) { 
     Game g = new Game(); 
     g.runGameLoop(); 
    } 

    private void runGameLoop() { 
     long initLoop = System.currentTimeMillis(); 
     // while(stillPlaying){ 
     long change = initLoop - System.currentTimeMillis(); 
     initLoop = System.currentTimeMillis(); 
     //Graphics2D gfx = (Graphics2D) strat.getDrawGraphics(); 
     //BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
       //"stackoverflow.png"); 
     //gfx.drawImage(sourceImage, 0, 0, null); 
     // } 
    } 

    public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D)g; 
     BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
       "stackoverflow.png"); 
     g.drawImage(sourceImage, 0, 0, this); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(800, 600); 
    } 

} 

Другой способ, который бы работали, если ваш resources был в папке src. Может быть, это не было до

enter image description here

Затем фрагменты кода, которые вы использовали, прежде чем бы я работал

BufferedImage sourceImage = ImageLoader.getImageLoader().getImage(
       "resources/stackoverflow.png"); 

.....

URL location = this.getClass().getClassLoader().getResource(place); 

Обратите внимание, в приведенном выше сценарии, при использовании getClass().getResource() без classLoader(), ваш путь должен начинаться с /

+0

К сожалению, все еще возникают проблемы с теми же ошибками. Я получаю исключение незаконного аргумента: input == null, хотя я не знаю, где null в качестве аргумента исходит от – Rycerub

+0

удаляет 'resources /' из вашего пути. –

+0

Я уже сделал это, спасибо за вашу помощь до сих пор (пока не работает) – Rycerub

Смежные вопросы