SpaceInvader

Hallo werte Gemeinde.
Ich habe mir ein Spaceinvaders game nachgebaut. Funktioniert auch soweit .

Aber wenn ich es per jar ausführe ist der Spieler nicht zu sehen und mit der Breite scheint auch was haarig zu sein.

Ich finde leider den Fehler in der Fenstergenerierung nicht.

Würde mich freuen wenn jemand mir helfen könnte.

MFG Nico

Ach bevor ich es vergesse, Code kann ich gerne schicken, wurde in Java geschrieben.

Es wäre hilfreich wenn du dazu etwas Quellcode postest. Ohne denn wird man dir nicht helfen können :wink:

Mal komplett ins blaue geraten: Du greifst „falsch“ auf das Bild zu, dass den Spieler darstellen soll. Stichwort File vs. getResourceAs…

Hier ein Teil des Codes aus meiner SpaceInvaderklasse.

public class SpaceInvader extends JApplet implements KeyListener , Runnable {

	
	private static final long serialVersionUID = -6797585595669880393L;
	public static final int WON = 1;
	public static final int LOST = 2; 
	
	private Player player;
	private boolean left, right;
	private Vector<Enemy> enemys;
	private Vector<Bullet> bullets;
	private int state = 0;
	
	public SpaceInvader(){
		setBounds(new Rectangle(200,300));
	}
	
	
	public void init(){
	 
		addKeyListener(this);
		setFocusable(true);
		player = new Player(getWidth()/2, getHeight()-Player.HEIGTH/2, getWidth());
		
		enemys = new Vector<Enemy>();
		for(int i = 0; i < 5; i++){
			for(int j= 0;j < 4; j++){
				Enemy newEN = new Enemy(Enemy.WIDTH*(2*i+2), Enemy.HEIGHT*(2*j+2), getWidth(), false);
				enemys.add(newEN);
			}
		}
		
		bullets = new Vector<Bullet>();
		
		new Thread(this).start();
	}
	
	
	
	
	/*
	 * Hier wird das Spielfeld generiert (non-Javadoc)
	 * @see java.awt.Container#paint(java.awt.Graphics)
	 */
	public void paint(Graphics graphics){
		BufferedImage image = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
		Graphics g = image.getGraphics();
		g.setColor(Color.BLACK); // Hintergrundfarbe des Spielfeldes
		g.fillRect(0, 0, getWidth(), getHeight());
		player.draw(g);
		for(int i = 0; i < enemys.size(); i++){
			enemys.get(i).draw(g);
		}
		for(int i = 0; i < bullets.size(); i++){
			bullets.get(i).draw(g);
		}
		
dann hab ich noch eine Main

public class mainClass {

	public static void main(String[] args) {
		
		
		 SpaceInvader theApplet = new SpaceInvader();
		 
	     
		    // Create a window (JFrame) and make applet the content pane.
		     javax.swing.JFrame window = new javax.swing.JFrame("SpaceInvader");
		     
		     window.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
		     
		     window.setContentPane(theApplet);
		     theApplet.init();   // invoke the applet's init() method
		     theApplet.start();  // starts the applet
		     window.setBounds(theApplet.getBounds());
		     window.setVisible(true);    // Make the window visible.
			}
	}

und da muss irgendwo der Wurm drin sein da das Fenster nicht alles sichtbar macht.

Poste mal bitte die Player-Klasse.

Hier die Playerklasse:

public class Player {

	public static final double SHOT_FREQUENCY = 3; // max Schuss pro Sek
	public static final double SPEED = 60; //Pixel pro Sek
	public static final int WIDTH = 20;
	public static final int HEIGTH = 20;
	public static final int MAX_HEALTH = 10;  //Lebensleiste
	
	private double x,y , maxX;
	private int health;
	private long lastShot;
	
	public Player(double x_, double y_, double maxX_){
		x = x_;
		y = y_;
		maxX = maxX_;
		health = MAX_HEALTH;
	}
	
	/*
	 * selbsterklärend / rechte Bewegung
	 */
	public void moveRight(double dt){      
		x+=dt*SPEED;
		if(x > maxX) 
			x = maxX;
	}
	
	/*
	 * selbsterklärend / linke Bewegung
	 */
	public void moveLeft(double dt){	
		x-=dt*SPEED;
		if(x < 0)
			x = 0;
	}
	
	/*
	 * geschossen und wie oft darf geschossen werden
	 */
	public void shoot(Vector<Bullet> bullets){
		double dt = (System.nanoTime()-lastShot)*1E-9;
		if(dt > 1.0/SHOT_FREQUENCY){
			bullets.add(new Bullet(x, y-HEIGTH/2-2, true));
			lastShot = System.nanoTime();
		}
	}
	/*
	 * Trefferbedingung, bei Treffer Health -1
	 */
	public void hit(){  
		health-=1;
	}
	/*
	 * Gesundheit oder Lebensenergie
	 */
	public int getHealth(){		
		return health;
	}
	/*
	 *  Getroffen ??  
	 */
	public boolean hitBy(Bullet b){
		Rectangle bounds = new Rectangle((int)x-WIDTH/2, (int)y-HEIGTH/2, WIDTH, HEIGTH);
		if(bounds.contains(new Point((int)b.getX(),(int) b.getY())))
			return true;
			return false;
	}
	
	/*
	 *  Hier wird das Aussehen des Feindes und des Spielers festgelegt, 
	 *  sowie die max. Anzahl des Lebensbalkens
	 */
	public void draw(Graphics g){
		g.setColor(Color.GREEN);  //Spielerfarbe
		g.fillRect((int)x-WIDTH/2, (int)y-HEIGTH/2, WIDTH, HEIGTH);
		g.setColor(Color.RED); //Feindfarbe
		g.fillRect(10, 10,(health*100)/MAX_HEALTH, 10); // Anzahl der Lebenspunkte
	}
	
	
	
}

Moderator muss erst noch freischalten den Code :frowning: dauert noch was.

Durch die später hinzugefügte mainClass zur jar Erzeugung, funktioniert die Fensterdarstellung nicht, vermute ich. Beim internen Ausführen geht es wunderbar.

tjaja, das leidige Freischalten,

bei Gelegenheit gewöhne dir aber bitte an, [ JAVA ] -Tags um Code drumherum zu schreiben,
siehe Zitat von einem deiner (von mit editieren) Postings

*** Edit ***

was planst du eigentlich, ein Applet in einem Browser so wie man Applets kennt?
wieso eine main-Klasse mit JFrame?

wenn du Standard-JFrame mit Swing meinst, leichter als Applet-Varianten am Anfang umzusetzen, was hat dann JApplet bei all dem verloren?
wenn du in allem gar nicht sicher bist, dann halte dich doch vielleicht bei Muße an Neuaufbau nach
http://forum.byte-welt.net/java-forum-das-java-welt-kompetenz-zentrum-wir-wissen-und-helfen-/spiele-und-multimedia-programmierung/5049-quaxlis-spiele-tutorial.html

dazu kann dir hier Sinnhaftigkeit garantiert und bei Problemen gewiss besser geholften werden als bei konfusen unbekannten Aufbau

Ok, du scheinst also gar keine Bildresourcen zu verwenden. Hab mit Applets jetzt nicht so wirklich viel Erfahrung (da sie langsam vor sich hinsterben). Vllt löst eine reorganisation deines Codes dein Problem. Erstelle dir ein Gamepanel (das nicht von JApplet erbt, sondern von JComponent oder JPanel). Dort überschreibst du dann zum zeichnen die paintComponent und fügst dieses als ContentPane entweder deinem Applet oder Frame hinzu.

Sinn und Zweck war es am Anfang das einzubinden. da ich aber noch eine Auflage bekommen hab das das per Befehl aufzurufen sein soll , hatte ich noch die main hinzuarbeiten müssen.

Das das jetzt wahrscheinlich nicht mehr ganz den Konventionen entsprechen wird , kann ich mir denken :frowning:

paint(Graphics graphics) zu überschreiben schickt sich wirklich nicht, das ist AWT, nicht Swing und kann alle möglichen Fehler verursachen
(die letzte Sonnenfinsternis? genau, deswegen!)
Malen in Swing Teil 1: der grundlegende Mechanismus – Byte-Welt Wiki

ruhig erstmal generell in Swing und JFrame üben, auch mit Spiele-Tutorial, wenn es funktioniert, dann auch an JApplet denken,
kann dann mit JPanel wie von Tomate_Salat beschrieben auch evtl. leicht zu wechseln sein

Naja, beim JApplet heißt die Methode schon noch paint. Aber es stimmt, dass man die “Applet-Schicht” so dünn wie möglich machen sollte. Man kann durchaus eine Anwendung so schreiben, dass man sie ohne viel drumherum als Applet ODER Anwendung ausführen kann.

Aber ich schätze, es gibt mehrere Probleme/Problemchen hier. Nochmal zur klärung: Wenn du das z.B. im Appletviewer oder aus Eclipse raus als Applet startest, geht alles, ABER wenn es als JAR verpackt (und auf eine Webseite gelegt?) ist, geht es NICHT mehr? (Bei letzteren gibt man die Fenstergröße ja selbst vor, deswegen ist nicht ganz klar, wo das Problem liegt bzw. wo es herkommt…)

Genau das ist das Problem. in Eclipse alles wunderbar , als Ausgeführte jar Crash. und wo der Fehler rumschwebt ist die Frage der Fragen.

“Crash”!? - das ist ja schon was anderes als (bzw. eine SEHR konkrete Ursache von) “Das zeigt irgendwas nicht richtig an”. Wenn’s da eine Fehlermeldung/StackTrage gibt, solltest du die posten…

Hmm, hier wird halt nicht wirklich klar wo das Problem steckt. Ein Swing-JApplet und dann trotzdem was selbst mit paint() zeichnen … das kann nur schief gehen. Hier solltest du mindestens eine weitere Eben tiefer gehen, von einem JPanel erben und dort korrekt paintComponent() überschreiben. Weiter willst du es als stand-alone haben, nimmst ein JFrame und packst dort den JApplet-Code rein. Das macht man so nicht. Entweder schreibt man es gleich als stand-alone und nimmt dann eine extra JApplet-Klasse die quasi als Launcher funktioniert und das eigentlich JFrame läd, oder wenn man sauber mit JPanel arbeitet ist dies deine Arbeitsgrundlage und es ist egal ob du es einem JApplet addest oder einem JFrame. Schon alleine deshalb würde sich ein re-write anbieten da du leider schon ziemlich ungünstig angefangen hast.

Weiter musst du beachten das die meisten IDEs ihre eigenen JDKs mitbringen die im inneren anders arbeiten als ein stand-alone Oracle-JDK/JRE und es daher, wenn man sich auf solche quirks verlässt, sehr schnell zu Fehlern kommen kann.

Und wie Marco schon sagte: erst heißt es “wird nicht richtig angezeigt” (erlich : sehr schwammige Umschreibung, versuchs etwas konkreter auszudrücken) und jetzt auf ein mal “crash” ? Im sinne von “kompletter Absturz” ? Dann auf jeden Fall Stacktrace posten.