# HILFEEEE!!! Ich verzweifle



## g0d3x (29. Mrz 2009)

Hi,
brauche unbedingt Hilfe bei meinem Programm, es hat soweit keine Fehler mehr, aba jetzt sagt er mir, dass die Referenz des Sprites (ship.png) nicht gefunden werden kann. Ich selbst beschäftige mich jetzt seit einem Jahr mit Java und das auch nicht sonderlich doll, aba ich versuch mein Bestes. Ich mache gerade Abitur und soll in Info ein Spiel programmieren.
Ich fühle mich jetzt son bisschen hilflos bei manchen Dingen , konnte aba soweit alle Probleme lösen . Jetzt is es soweit fertig will aba einfach nicht starten. Nun suche ich nach Hilfe, weil ich schon seit 1 Woche versuche das Problem zu lösen, bekommen es aba einfach nicht hin.
*
Hier mal der Code der Hauptklasse:*

[HIGHLIGHT="Java"]import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;
import java.util.ArrayList;

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


public class Game extends Canvas {

	private static final long serialVersionUID = 1L;

private BufferStrategy strategy;

  private boolean gameRunning = true;

  private ArrayList<Entity> entities = new ArrayList<Entity>();

  private ArrayList<Entity> removeList = new ArrayList<Entity>();

  private Entity ship;

  private double moveSpeed = 300;

  private long lastFire = 0;

  private long firingInterval = 300;

  private int alienCount;


  private String message = "";

  private boolean waitingForKeyPress = true;

  private boolean leftPressed = false;

  private boolean rightPressed = false;

  private boolean firePressed = false;

  private boolean logicRequiredThisLoop = false;

  public Game() {


    JFrame container = new JFrame("Invasion Of The Celestians");



    JPanel panel = (JPanel) container.getContentPane();
    panel.setPreferredSize(new Dimension(800,600));
    panel.setLayout(null);



    setBounds(0,0,800,600);
    panel.add(this);



    setIgnoreRepaint(true);



    container.pack();
    container.setResizable(false);
    container.setVisible(true);


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



    addKeyListener(new KeyInputHandler());



    requestFocus();



    createBufferStrategy(2);
    strategy = getBufferStrategy();



    initEntities();
  }


  private void startGame() {


    entities.clear();
    initEntities();



    leftPressed = false;
    rightPressed = false;
    firePressed = false;
  }


  private void initEntities() {


    ship = new Spieler(this,"pics/ship.png",370,550);
    entities.add(ship);



    alienCount = 0;
    for (int row=0;row<5;row++) {
      for (int x=0;x<12;x++) {
        Entity alien = new Alien(this,"pics/alien1.gif",100+(x*50),(50)+row*30);
        entities.add(alien);
        alienCount++;
      }
    }
  }


  public void updateLogic() {
    logicRequiredThisLoop = true;
  }


  public void removeEntity(Entity entity) {
    removeList.add(entity);
  }


  public void notifyDeath() {
    message = "Oh nein! Sie haben dich nochmal?";
    waitingForKeyPress = true;
  }


  public void notifyWin() {
    message = "Super! Du hast gewonnen";
    waitingForKeyPress = true;
  }

  public void notifyAlienKilled() {


    alienCount--;

    if (alienCount == 0) {
      notifyWin();
    }



    for (int i=0;i<entities.size();i++) {
      Entity entity = (Entity) entities.get(i);

      if (entity instanceof Alien) {


        entity.setHorizontalMovement(entity.getHorizontalMovement() * 1.5);
      }
    }
  }


  public void tryToFire() {


    if (System.currentTimeMillis() - lastFire < firingInterval) {
      return;
    }



    lastFire = System.currentTimeMillis();
    Shot shot = new Shot(this,"pics/shot1.png",ship.getX()+10,ship.getY()-30);
    entities.add(shot);
  }


  public void gameLoop() {
    long lastLoopTime = System.currentTimeMillis();



    while (gameRunning) {

      long delta = System.currentTimeMillis() - lastLoopTime;
      lastLoopTime = System.currentTimeMillis();


      Graphics2D g = (Graphics2D) strategy.getDrawGraphics();
      g.setColor(Color.black);
      g.fillRect(0,0,800,600);



      if (!waitingForKeyPress) {
        for (int i=0;i<entities.size();i++) {
          Entity entity = (Entity) entities.get(i);

          entity.move(delta);
        }
      }



      for (int i=0;i<entities.size();i++) {
        Entity entity = (Entity) entities.get(i);

        entity.draw(g);
      }



      for (int p=0;p<entities.size();p++) {
        for (int s=p+1;s<entities.size();s++) {
          Entity ich = (Entity) entities.get(p);
          Entity er = (Entity) entities.get(s);

          if (ich.collidesWith(er)) {
            ich.collidedWith(er);
            er.collidedWith(ich);
          }
        }
      }


      entities.removeAll(removeList);
      removeList.clear();



      if (logicRequiredThisLoop) {
        for (int i=0;i<entities.size();i++) {
          Entity entity = (Entity) entities.get(i);
          entity.doLogic();
        }

        logicRequiredThisLoop = false;
      }

      if (waitingForKeyPress) {
        g.setColor(Color.white);
        g.drawString(message,(800-g.getFontMetrics().stringWidth(message))/2,250);
        g.drawString("Bitte eine Taste drücken!",(800-g.getFontMetrics().stringWidth("Bitte eine Taste drücken!"))/2,300);
      }



      g.dispose();
      strategy.show();



      ship.setHorizontalMovement(0);

      if ((leftPressed) && (!rightPressed)) {
        ship.setHorizontalMovement(-moveSpeed);
      } else if ((rightPressed) && (!leftPressed)) {
        ship.setHorizontalMovement(moveSpeed);
      }



      if (firePressed) {
        tryToFire();
      }



      try { Thread.sleep(10); } catch (Exception e) {}
    }
  }


  private class KeyInputHandler extends KeyAdapter {

    private int pressCount = 1;


    public void keyPressed(KeyEvent e) {

      if (waitingForKeyPress) {
        return;
      }


      if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        leftPressed = true;
      }
      if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        rightPressed = true;
      }
      if (e.getKeyCode() == KeyEvent.VK_SPACE) {
        firePressed = true;
      }
    }


    public void keyReleased(KeyEvent e) {

      if (waitingForKeyPress) {
        return;
      }

      if (e.getKeyCode() == KeyEvent.VK_LEFT) {
        leftPressed = false;
      }
      if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
        rightPressed = false;
      }
      if (e.getKeyCode() == KeyEvent.VK_SPACE) {
        firePressed = false;
      }
    }


    public void keyTyped(KeyEvent e) {


      if (waitingForKeyPress) {
        if (pressCount == 1) {


          waitingForKeyPress = false;
          startGame();
          pressCount = 0;
        } else {
          pressCount++;
        }
      }



      if (e.getKeyChar() == 27) {
        System.exit(0);
      }
    }
  }


  public static void main(String argv[]) {
    Game g =new Game();


    g.gameLoop();
  }
}
[/HIGHLIGHT]

*dann noch die Klasse der Hauptfigur:*

[HIGHLIGHT="Java"]
public class Spieler extends Entity
{

  private Game Spiel;


  public Spieler(Game Spiel,String ref,int x,int y)
  {
    super(ref,x,y);

    this.Spiel = Spiel;
  }

   public void move(long delta)
   {


    if ((dx < 0) && (x < 10))
    {
      return;
    }


    if ((dx > 0) && (x > 750))
    {
      return;
    }

    super.move(delta);
   }


  public void collidedWith(Entity other)
  {


    if (other instanceof Alien)
     {

       Spiel.notifyDeath();
     }
  }

}
[/HIGHLIGHT]

*und dann noch die Entity:*

[HIGHLIGHT="Java"]
import java.awt.Graphics;
import java.awt.Rectangle;

public abstract class Entity
{

  protected double x;
  protected double y;
  protected Sprite sprite;
  protected double dx;
  protected double dy;
  private Rectangle ich = new Rectangle();
  private Rectangle er = new Rectangle();

  public Entity(String ref,int x,int y)
  {
    this.sprite = SpriteStore.get().getSprite(ref);
    this.x = x;
    this.y = y;
  }

  public void move(long delta)
  {


    x += (delta * dx) / 1000;
    y += (delta * dy) / 1000;
  }

  public void setHorizontalMovement(double dx)
  {
    this.dx = dx;
  }

  public void setVerticalMovement(double dy)
  {
    this.dy = dy;
  }

  public double getHorizontalMovement()
  {
    return dx;
  }

  public double getVerticalMovement()
  {
    return dy;
  }

  public void draw(Graphics g)
  {
    sprite.draw(g,(int) x,(int) y);
  }

  public void doLogic()
  {
  }

  public int getX()
  {
    return (int) x;
  }

  public int getY()
  {
    return (int) y;
  }

  public boolean collidesWith(Entity other)
  {
    ich.setBounds((int) x,(int) y,sprite.getWidth(),sprite.getHeight());
    er.setBounds((int) other.x,(int) other.y,other.sprite.getWidth(),other.sprite.getHeight());

    return ich.intersects(er);
  }


  public abstract void collidedWith(Entity other);
}
[/HIGHLIGHT]

vielen Dank schon mal im Voraus

mfg g0d3x


----------



## hdi (29. Mrz 2009)

Die Klasse SpriteStore wäre jetzt noch hilfreich.
Noch hilfreicher wäre es aber, wenn du etwas konkreter wirst mit dem Problem.

Poste bitte mal die Fehlermeldung.


----------



## g0d3x (29. Mrz 2009)

also er sagt mir das er ein bild nicht finden kann (pics/ship.png).
*
hier der spritestore:*
[HIGHLIGHT="Java"]
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;

import javax.imageio.ImageIO;


public class SpriteStore
{

  private static SpriteStore single = new SpriteStore();

  public static SpriteStore get()
  {
    return single;
  }

  private HashMap<String, Sprite> sprites = new HashMap<String, Sprite>();


  public Sprite getSprite(String ref)
  {

    if (sprites.get(ref) != null)
    {
      return (Sprite) sprites.get(ref);
    }

    BufferedImage sourceImage = null;

    try
    {

      URL url = this.getClass().getClassLoader().getResource(ref);

      if (url == null)
      {
        fail("Kann keine Refezenz finden: "+ref);
      }


      sourceImage = ImageIO.read(url);
    } catch (IOException e)
      {
      fail("Laden fehlgeschlagen: "+ref);
      }

    GraphicsConfiguration gc = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
    Image image = gc.createCompatibleImage(sourceImage.getWidth(),sourceImage.getHeight(),Transparency.BITMASK);

    image.getGraphics().drawImage(sourceImage,0,0,null);

    Sprite sprite = new Sprite(image);
    sprites.put(ref,sprite);

    return sprite;
  }

  private void fail(String message)
  {
    System.err.println(message);
    System.exit(0);
  }
}
[/HIGHLIGHT]

die Fehlermeldung lautet: Kann keine Refezenz finden: pics/ship.png

mfg g0d3x


----------



## hdi (29. Mrz 2009)

Okay mit der Methode getResource() kenne ich mich leider nicht aus...
Sie liefert wohl eine URL basierend auf einem Pfad. Soll das wohl eine relative
Pfadangabe sein?

Überhaupt: Passiert das nur bei diesem einen ship.png Bild, oder bei allen?
Also das nahgeliegendste ist jetzt, denke ich, dass der Pfad einfach nicht korrekt
ist von dem Bild,
oder das Bild nicht in einem Ordner liegt, den du innerhalb dieser Klasse per getResource() 
erreichen kannst, oder so.

Lädt er denn andere Bilder auf die gleiche Weise erfolgreich?


----------



## g0d3x (29. Mrz 2009)

ja eigenartiger Weise macht er das ! deswegen kann ich ja das problem nicht lösen und das is auch der grund warum mich diese ganze scheisse zum Verzweifeln brint 

mfg


----------



## hdi (29. Mrz 2009)

Naja dann *muss* es ja an einem oder einer Kombination aus folgenden Dingen liegen:

a) Die Datei befindet sich in einem anderen Ordner als alle anderen Dateien
b) Die Datei kann nicht gelesen werden (ich weiss nicht was getResource() konkret tut)
c) Was du zur Laufzeit als "ref" übergibst stimmt nicht mit dem Namen der Datei überein.
Gross-/Kleinschreibung beachtet? Leerzeichen beachtet?
d) die Datei ist nicht "Teil" des Projekts, auf blöd? ka...mach mal Rechtsklick auf dein Projekt -> Refresh.


----------



## André Uhres (29. Mrz 2009)

Hier ist mal ein kleines Beispiel, damit kannst du es gleich testen (Quellcode im jar): File-Upload.net - Game2.jar


----------



## andre111 (30. Mrz 2009)

Sieht verdächtig danach aus:
Space Invaders 101 - An Accelerated Java 2D Tutorial | Coke And Code - Java Games and Games Development


----------



## dayaftereh (30. Mrz 2009)

Hey

Also ich lade meine Images in meine Spiel, mit hilfe eine Klasse ImageLoader.java, da habe ich eine HashMap drine damit ich nicht immer neu die Bilder in den Speicher laden muss , vielicht hilft sie dir, ist halt eine Singelton^^


```
package net.shipshoot.lib.resources;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import javax.imageio.ImageIO;

import org.apache.log4j.Logger;

public class ImageLoader {

	public static final int SHIP1 = 1;
	public static final int SHIP1MOVE = 2;

	public static final int SHOT1 = 19;
	
	public static final int CANON_SPEZIAL = 26;

	public static final int EXPLODE = 27;
	public static final int EXPLODE2 = 28;

	public static final int DEAD = 30;

	public static final int CONNECT_DIALOG = 120;
	public static final int SHIP_CHOOSER = 121;

	private static ImageLoader instance = new ImageLoader();

	private Logger log = Logger.getLogger(ImageLoader.class);

	private Map<String, BufferedImage> images = Collections.synchronizedMap(new HashMap<String, BufferedImage>());
	private Map<Integer, String> paths = new HashMap<Integer, String>();

	private ImageLoader() {
		initPaths();
	}

	public BufferedImage getObjectImages(int type) {
		return loadImage(paths.get(type));
	}

	private void initPaths() {

		/* Image Ship1 */
		paths.put(ImageLoader.SHIP1, "ships/ship1.jpg");
		paths.put(ImageLoader.SHIP1MOVE, "ships/ship1move.jpg");

		/* Images Schusse */
		paths.put(ImageLoader.SHOT1, "weapons/canon1.gif");
				
		/* Explosionen */
		paths.put(ImageLoader.EXPLODE, "util/explode.gif");
		
               /* Image Tod */
		paths.put(ImageLoader.DEAD, "util/dead.jpg");

		/* Hintergrund Bilder */
		paths.put(ImageLoader.CONNECT_DIALOG, "util/connectdialog_bg.jpg");
		paths.put(ImageLoader.SHIP_CHOOSER, "util/shipchoose_bg.jpg");
	}

	private synchronized BufferedImage loadImage(String name) {
		BufferedImage img = null;

		Package packageName = getClass().getPackage();
		String path = packageName.getName().replace(".", "/");

		if (path.trim().endsWith("/") == false) {
			path += "/";
		}

		path = path + name;

		if (images.containsKey(path)) {
			img = images.get(path);
		} else {
			try {
				img = ImageIO.read(getClass().getClassLoader().getResource(path));
				images.put(path, img);
			} catch (IOException e) {
				log.error(e);
				log.error("Try to find Image at " + path);
			}
		}

		return img;
	}
	
	public static ImageLoader getInstance() {
		return instance;
	}

}
```

Schau dir mal die Funktion loadImage() an, vielicht hilft sie dir ja^^

und ich holle mir dan die Images immer so :


```
ImageLoader.getInstance().getObjectImages(ImageLoader.EXPLODE2)
```


----------

