2016-05-31 7 views
1

Also ich bin ziemlich neu in Java und ich baute dieses Board für ein Snake-Spiel mit einem tutorial. Es scheint gut zu funktionieren, außer dass die Bilddateien nicht geladen werden. Ich habe noch nicht mit Bildern in Eclipse gearbeitet, daher weiß ich nicht wirklich, was ich mache. Ich habe versucht, die .png Bilddateien in das Paket zu packen, aber das hat mir überhaupt nicht geholfen. Ich würde mich über irgendwelche Ideen freuen.Bilddateien laden nicht in 2D Java-Spiel

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

Debug Ihre Anwendung. Erhalten Sie in 'loadImages()' eine gültige ImageIcon, wenn Sie Ihre Bilder laden?Wenn nicht, kann das Bild nicht am Pfad gefunden werden. Versuchen Sie, den vollständigen Pfad zum Bild anzugeben, z. B. "C: \\ Entwicklung \\ Spiel \\ head.png" '. – Frecklefoot

Antwort

0

Ich versuchte, die .png Bilddateien im Paket setzte

ich gegen setzt die Bilddateien im selben Paket wie die Quelldateien raten würde. In der Tat sieht eine gemeinsame Hierarchie für Quellordner wie folgt aus:

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

Im src/main/java Quellordner, Sie verschiedene Pakete für Quelldateien haben. Das Gleiche gilt für src/test/java, außer dass es sich um Testdateien handelt.

In src/main/resources können Sie Ordner platzieren, die alle Ressourcendateien (i18n-Dateien, Bilder usw.) enthalten. Diese Ordner können vom Erstellungspfad ausgeschlossen werden und müssen keine Quellordner sein.

Zum Beispiel:

enter image description here

Dann sollten Sie in der Lage zu tun:

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

Danke! Das hat funktioniert! –

+0

@ZachPrice froh zu helfen - und willkommen in SO! Wenn Sie glauben, dass diese Antwort (oder eine andere Antwort) Ihre ursprüngliche Frage vollständig beantwortet hat, denken Sie bitte darüber nach, diese Antwort zu akzeptieren. – avojak

0

Use ImageIO instead.

Wenn Sie eine ImageIcon benötigen, erstellen Sie aus einem Bild durch ImageIO geladen. In diesem Fall benutzt das Spiel nicht einmal das Icon, also stört es nicht, benutzt einfach ImageIO, um ein BufferedImage zu laden.

ImageIO.read() ist überladen, um eine Datei, einen InputStream oder eine URL zu akzeptieren. So wo Ihre Dateien müssen lokalisiert werden, hängt davon ab, wie Sie es verwenden. Versuchen Sie, Ihre Bilder in einem bestimmten Ort setzen und verwenden Sie einen absoluten Pfad zum Test:

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

Sobald Sie, dass Arbeiten Sie an der allgemeinen Dokumentation um File oder ClassLoader.getResource() auf beziehen können, wo Dateien aus geladen werden.

ich Eclipse-nicht jedoch verwende ich in der Regel vermuten, wahrscheinlich Sie wollen:

  1. die Bilddateien in das gleiche Paket wie die Klasse Vorstand Put.
  2. Verwenden Sie getClass().getResourceAsStream(...), um einen InputStream zu erhalten.
  3. Konvertieren Sie den Stream in ein Bild.

Etwas wie:

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

ImageIO hat auch den Vorteil, Ihnen weitere nützliche Ausnahmen geben, wenn Laden auch ausfällt.

Verwandte Themen