2016-05-31 37 views
1

所以我對Java很新,而且我使用tutorial構建了一個用於蛇遊戲的此板。它似乎工作正常,除了圖像文件不會加載的事實。我之前沒有在Eclipse中使用過圖片,所以我不知道自己在做什麼。我嘗試將.png圖像文件放入包中,但這根本沒有任何幫助。我會很感激任何想法。圖像文件不會加載到2D Java遊戲

import java.awt.Color; 
import java.awt.Dimension; 
import java.awt.Font; 
import java.awt.FontMetrics; 
import java.awt.Image; 
import java.awt.Graphics; 
import java.awt.Toolkit; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

import javax.swing.ImageIcon; 
import javax.swing.JPanel; 
import javax.swing.Timer; 

public class Board extends JPanel implements ActionListener { 

/** 
* 
*/ 
private static final long serialVersionUID = 1L; 
private final int B_WIDTH = 300; 
private final int B_HEIGHT = 300; 
private final int DOT_SIZE = 10; 
private final int ALL_DOTS = 900; 
private final int RAND_POS = 29; 
private final int DELAY = 140; 

private final int x[] = new int[ALL_DOTS]; 
private final int y[] = new int[ALL_DOTS]; 

private int dots; 
private int apple_x; 
private int apple_y; 

private boolean leftDirection = false; 
private boolean rightDirection = true; 
private boolean upDirection = false; 
private boolean downDirection = false; 
private boolean inGame = true; 

private Timer timer; 
private Image ball; 
private Image apple; 
private Image head; 

public Board() { 
    addKeyListener(new TAdapter()); 
    setBackground(Color.black); 
    setFocusable(true); 

    setPreferredSize(new Dimension(B_WIDTH, B_HEIGHT)); 
    loadImages(); 
    initGame(); 
    } 

private void loadImages() { 

    ImageIcon iid = new ImageIcon("dot.png"); 
    ball = iid.getImage(); 

    ImageIcon iia = new ImageIcon("apple.png"); 
    apple = iia.getImage(); 

    ImageIcon iih = new ImageIcon("head.png"); 
    head = iih.getImage(); 
} 

private void initGame() { 

    dots = 3; 

    for (int z = 0; z < dots; z++) { 
     x[z] = 50 - z * 10; 
     y[z] = 50; 
    } 

    locateApple(); 

    timer = new Timer(DELAY, this); 
    timer.start(); 
} 

@Override 
public void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    doDrawing(g); 
} 

private void doDrawing(Graphics g) { 

    if (inGame) { 

     g.drawImage(apple, apple_x, apple_y, this); 

     for (int z = 0; z < dots; z++) { 
      if (z == 0) { 
       g.drawImage(head, x[z], y[z], this); 
      } else { 
       g.drawImage(ball, x[z], y[z], this); 
      } 
     } 

     Toolkit.getDefaultToolkit().sync(); 
    } else { 

     gameOver(g); 
    } 
} 

private void gameOver (Graphics g) { 

    String msg = "Game Over"; 
    Font small = new Font ("Helvetica", Font.BOLD, 14); 
    FontMetrics metr = getFontMetrics(small); 

    g.setColor(Color.white); 
    g.setFont(small); 
    g.drawString(msg, (B_WIDTH - metr.stringWidth(msg))/2, B_HEIGHT/2); 

} 

private void checkApple(){ 

    if ((x[0] == apple_x) && (y[0] == apple_y)) { 

     dots++; 
     locateApple(); 
    } 
} 

private void move() { 

    for (int z = dots; z > 0; z--) { 

     x[z] = x[(z - 1)]; 
     y[z] = y[(z - 1)]; 
    } 

    if (leftDirection) { 
     x[0] -= DOT_SIZE; 
    } 

    if (rightDirection) { 
     x[0] += DOT_SIZE; 
    } 

    if (upDirection) { 
     y[0] -= DOT_SIZE; 
    } 

    if (downDirection) { 
     y[0] += DOT_SIZE; 
    } 
} 

private void checkCollision(){ 

    for (int z = dots; z > 0; z--) { 

     if ((z > 4) && (x[0] == x[z]) && (y[0] == y[z])) { 


     } 
    } 

    if (y[0] >= B_HEIGHT) { 
      inGame = false; 
     } 

     if (y[0] < 0) { 
      inGame = false; 
     } 

     if (x[0] >= B_WIDTH) { 
      inGame = false; 
     } 

     if (x[0] < 0) { 
      inGame = false; 
     } 

     if(!inGame) { 
      timer.stop(); 
     } 
} 


private void locateApple() { 

    int r = (int) (Math.random() * RAND_POS); 
    apple_x = ((r * DOT_SIZE)); 

    r = (int) (Math.random() * RAND_POS); 
    apple_y = ((r * DOT_SIZE)); 
} 

@Override 
public void actionPerformed(ActionEvent e) { 

    if (inGame) { 

     checkApple(); 
     checkCollision(); 
     move(); 
    } 

    repaint(); 
} 

private class TAdapter extends KeyAdapter { 

    @Override 
    public void keyPressed(KeyEvent e) { 

     int key = e.getKeyCode(); 

     if ((key == KeyEvent.VK_LEFT) && (!rightDirection)) { 
      leftDirection = true; 
      upDirection = false; 
      downDirection = false; 
     } 

     if ((key == KeyEvent.VK_RIGHT) && (!leftDirection)) { 
      rightDirection = true; 
      upDirection = false; 
      downDirection = false; 
     } 

     if ((key == KeyEvent.VK_UP) && (!downDirection)) { 
      upDirection = true; 
      rightDirection = false; 
      leftDirection = false; 
     } 

     if ((key == KeyEvent.VK_DOWN) && (!upDirection)) { 
      downDirection = true; 
      rightDirection = false; 
      leftDirection = false; 
     } 
    } 
} 

} 
+0

調試應用程序。在'loadImages()'中,當你加載你的圖像時,你會得到一個有效的ImageIcon嗎?如果不是,則無法在路徑中找到圖像。嘗試提供圖像的完整路徑,例如'「C:\\ Development \\ Game \\ head.png」'。 – Frecklefoot

回答

0

我試圖把PNG圖片文件包

我建議不要把圖像文件在同一個包的源文件。事實上,對源文件夾通用的等級是這樣的:

src/main/java 
src/main/resources 
src/test/java 
src/test/resources 

內的src/main/java源文件夾,你可以有你不同的包的源文件。與src/test/java相同,只是它們是測試文件。

在src/main/resources中,可以放置包含所有資源文件(i18n文件,圖像等)的文件夾。這些文件夾可以從構建路徑中排除,不需要是源文件夾。

例如:

enter image description here

然後,你應該能夠做到:

public static void main(String... args) { 
    final ImageIcon imageIcon = new ImageIcon("src/main/resources/Desert.jpg"); 
} 
+0

謝謝!這工作! –

+0

@ZachPrice樂於幫助 - 歡迎來到SO!如果您覺得這個答案(或其他答案)已經完全解答了您的原始問題,請考慮接受該答案。 – avojak

0

Use ImageIO instead.

如果你需要一個ImageIcon,創建一個從ImageIO的通過加載圖像。在這種情況下,遊戲甚至不使用圖標,所以不要打擾,只需使用ImageIO加載BufferedImage即可。

ImageIO.read()被重載以接受File,InputStream或URL。所以其中您的文件需要位於取決於你如何使用它。嘗試把你的圖片在一個特定的位置,並使用絕對路徑來測試:

private void loadImages() { 
    ball = ImageIO.read(new File("c:/img/dot.png")); 
} 

一旦你的工作,你可以參考相關的文檔在哪裏文件將被加載圍繞FileClassLoader.getResource()

我不使用Eclipse,但是我懷疑在一般你可能想:

  1. 把圖像文件放入同一個包董事會類。使用getClass().getResourceAsStream(...)來獲得InputStream。
  2. 將流轉換爲圖像。

喜歡的東西:

public void loadImages() { 
    ball = ImageIO.read(getClass().getResourceAsStream("dot.png")); 
} 

的ImageIO也有給你更多的有用的異常時加載失敗過好處。