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.
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 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.
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
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…)
“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.