# Probleme mit .jar



## kruemelkeksfan (21. Apr 2014)

Hallo Leute,

ich feile nun schon seit einiger Zeit noch ein bisschen an einem Spiel rum, das ich auch schon hier im Forum vorgestellt habe:

http://www.java-forum.org/spiele-mu...8-spielvorstellung-deadstorm.html#post1015355

Zum Download gibts den Spaß hier:

DeadStorm Download

Im Moment habe ich noch 2 Hauptprobleme:

1. Der Sound funktioniert scheinbar nur ordnungsgemäß, wenn das Spiel aus der Kommandozeile gestartet wird.
Bei einfachem Doppelklick auf die .jar oder .class wird der Sound zwar manchmal abgespielt, aber eben nicht immer. Er fällt meistens aus, wenn ich versuche, schnell hintereinander zu schießen und beim Nachladevorgang, also wenn sich z.T. mehrere Geräusche überlappen oder zumindest knapp hintereinander gespielt werden.
Wie bereits geschrieben: aus dem Terminal heraus funktioniert es problemlos 

2. Windows will nicht. Ich habe das Programm auf einem MacBook geschrieben, auf Mac's mit den neuesten Java-Versionen läuft die JDK 6 Version scheinbar problemlos, die JDK 8 Version läuft jedoch nur bei mir. Ein Freund hat sie auch auf seinem Mac ausprobiert, und sagt, sie funktioniert nicht, obwohl er die neueste JRE drauf hat.
Auf Windows läuft keine der JAR-Versionen und auf dem Mac meiner Mutter (vermutlich veraltete JRE) läuft zwar die JDK 6 Version, allerdings bleibt der Bildschirm schwarz.
Wenn ich über die Kommandozeile starte, krieg ich je nach System, JDK-Version und Kompilierungsart (NetBeans oder manuell) entweder eine NullPointerException wegen den Grafiken oder einen UnsupportedClassVersionError (Bei Windows stilvoll untermalt mit der Meldung: "A Java Exception has occured").

Kann mir irgendjemand helfen? Hat schon mal jemand sowas gesehen? Ich habe gestern mit meinem Kumpel (er ist Programmierer...) bis um 3 davorgesessen, ohne eine Lösung zu finden...


----------



## turtle (21. Apr 2014)

> Windows will nicht.


Stimmt. Was hast du denn da für'n Quark programmiert?

Ich habe mal zum Spass die Zeile device.setFullScreenWindow(this) rausgenommen, manchmal möchten wir sehen, was passiert, und schon knallt es.
Also rudimentär laufen sollte es doch schon, oder?


```
Exception in thread "Thread-2" java.lang.IllegalArgumentException: bound must be positive
	at java.util.Random.nextInt(Random.java:388)
	at GameLoop.run(GameLoop.java:182)
	at java.lang.Thread.run(Thread.java:744)
```
Und du erwartest echt, das wir dir dabei helfen?


----------



## kruemelkeksfan (21. Apr 2014)

Full-Screen Exclusive Mode (The Java™ Tutorials > Bonus > Full-Screen Exclusive Mode API)

Hier hab ich das mit dem Vollbild her.

Leider seh ich bei deinen Ausführungen nicht ganz durch. Die exception die du zeigst, hab ich noch nicht bei mir gesehen. Ansonsten muss ich ja scheinbar was fatal simples falsch gemacht haben, deinem Ausdruck nach zu urteilen. In dem Falle verschiebt den Thread halt in die Anfängerthemen aber erklärt mir doch bitte um Himmels willen, was hier schief läuft :bahnhof:


----------



## Ruzmanz (21. Apr 2014)

Wenn keine Bilder gefunden werden, dann gib einfach den Pfad aus und du kannst manuell nachgucken, wo Java die erwartet. Es gibt viele Gründe warum der Bildschirm schwarz bleibt. Suche dir eien Alternative zu "setFullScreenWindow" und dann wird es sicherlich klappen ...


----------



## turtle (21. Apr 2014)

Ich habe mir mal die Mühe gemacht und es unter Windows ans Laufen gebracht. Ich hab ja auch nicht viel zu tun an Ostern

Ich habe den "unsäglichen" Full-Screen-Modus rausgenommen und eine feste Grösse genommen. Dieses verträgt sich aber nicht mit dem Info-Panel, weil das einfach über die Canvas malt, egal was da bereits steht.
Das Laden der Images habe ich ebenfalls geändert.  Bei Player sieht es so aus, bei den anderen analog:

```
public Player(int X, int Y, int Rot, GameWindow window) {
		this.X = X;
		this.Y = Y;
		this.Rot = Rot;
		this.window = window;

		imgArray = new ImageIcon[4][8];
		for (int I = 0; I < 4; I++) {
			for (int U = 0; U < 8; U++) {
				URL resource = GameArea.class.getResource("player/player" + I + "-" + U + ".png");
				imgArray[I][U] = new ImageIcon(resource);
			}
		}
		phase = 0;
		dead = false;
	}
```
Weiterhin hasse ich es, wenn irgendwo im Code geheime Konstanten stehen, also stattdessen

```
if (code == KeyEvent.VK_UP || code == KeyEvent.VK_W) {
			up = true;
		}
```


Ob das Spielfeldd so nun "richtig" aussieht, weiss ich nicht. Auf jeden Fall eine "Grassteppe" auf der Horden von "Zombies" auftauchen, die man erschiessen muss.

Obs sehr viel schwieriger wird in höheren levels, kann ich nicht sagen.

Läuft aber bei mir unter Windows mit Java-8 (64-bit) ganz ordentlich.


----------



## kruemelkeksfan (21. Apr 2014)

Komischerweise wird Text auch nicht angezeigt. Das spricht dagegen, dass Bilddateien nicht gefunden werden...


----------



## turtle (21. Apr 2014)

Reden wir über den gleichen Code?


```
// METHODS
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		// Background
		for (int I = 0; I < bgImgArray.length; I++) {
			for (int U = 0; U < bgImgArray[I].length; U++) {
				background = bgImgArray[I][U].getImage();
				g.drawImage(background, (I * 25), (U * 25), this);
			}
		}
		// Player
		playerImg = (player.getImg()).getImage();
		g.drawImage(playerImg, player.getPosi(1), player.getPosi(2), this);

		// Zed
		for (int I = 0; I < horde.size(); I++) {
			zedImg = ((horde.get(I)).getImg()).getImage();
			g.drawImage(zedImg, (horde.get(I)).getPosi(1), (horde.get(I)).getPosi(2), this);
		}

		// Info Panel
		g.setColor(new Color(25, 25, 25));
		g.setFont(letter);
		g.drawString(("Current Level: " + lvl), 10, 30);
		g.drawString(("You survived " + (time / 1000) + " seconds"), (window.getWidth() - 250), 30);
		g.drawString(("You slaughtered " + zedCount + " braineaters"), (window.getWidth() - 250), 60);
		g.drawString(("Ammo: " + ammo + "/8"), (window.getWidth() - 250), window.getHeight() - 40);
		if (reloadState == 1) {
			g.drawString(("opening drum..."), (window.getWidth() - 150), window.getHeight() - 40);
		}
```


----------



## kruemelkeksfan (21. Apr 2014)

Prinzipiell schon. Das Laden der Hintergrundbilder läuft ähnlich wie das der Spielergrafiken.
Mir hilft der Fenstermodus nicht, das Fenster bleibt dann trotzdem weiß.


----------



## turtle (21. Apr 2014)

Ich hatte zum Test mal ein drawOval() eingebaut, um zu sehen, ob deine App überhaupt was malt.

Als ich gesehen habe, das dem so ist, habe ich das Laden der Imageresourcen geändert. Nun werden alle Images geladen und auch richtig gezeichnet.

Wie bereits erwähnt lade ich ALLE Images ungefähr so, also auch bei Player bzw. Zed und nicht nur bei Background:

```
URL resource = GameArea.class.getResource("pics/meadow" + (rand.nextInt(10)) + ".png");
	bgImgArray[I][U] = new ImageIcon(resource);
```


----------



## kruemelkeksfan (21. Apr 2014)

Nö, das hilft bei mir nicht. Aber ich hab auch Win7 und wie schon erwähnt, wird Schrift bei mir auch nicht angezeigt...somit würde auch ein drawOval nicht gepaintet werden...

Edit:
Ich habs gerade zur Sicherheit noch mal probiert: unter Mac bekomm ich einen leuchtend roten Kreis, unter Win nix...


----------



## turtle (22. Apr 2014)

Ich werde heute abend dir mal meinen Code per PN schicken. 

Gezipped sind es ungefähr 4 MB und damit zu gross hier zu posten.:noe:


----------



## kruemelkeksfan (22. Apr 2014)

Ok, danke


----------



## kruemelkeksfan (27. Apr 2014)

Ok, wie Turtle schon gezeigt hat, liegt die Lösung des Problems darin "/" als File-Seperator zu verwenden und nicht den vom Betriebssystem vorgegebenen, da .jar-Files intern immer "/" verwenden.


----------

