# 2 Applets/Klassen zu eins verschmelzen



## BlinD (16. Aug 2007)

2 Applets/Klassen zu eins verschmelzen


Hallo , ich hab ein problem:

Ich habe 2 Applets


```
import java.applet.*;
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;

public class Raumschiff extends JApplet implements Runnable
{ 
//	image FlugImage;
	AudioClip hit;
	double winkel=0;
	
	public void init()
	{
		
		setBackground (Color.blue);
		setSize(600,600);
		FlugImage = getImage (getDocumentBase(), "bilder/flug.gif");
	    hit = getAudioClip (getDocumentBase(), "Sound/bounce.au");
		hit.play();
	}

	public void start() { 
		// Schaffen eines neuen Threads, in dem das Spiel läuft
		Thread th = new Thread ((Runnable) this);
		//Starten des Threads
		th.start ();		
	}

	public void stop() { }
	public void destroy() { }

	public void run()
	{
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
		while (true)
		{
			winkel +=Math.PI/10; 
			repaint();
			try{Thread.sleep (20);}
			catch (InterruptedException ex){ }
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		}
	}
	

	
	public void paint (Graphics g) { 
		Graphics2D g2d = (Graphics2D) g;		
		AffineTransform at1 = new AffineTransform();
		at1.setToTranslation(100,100);
		at1.rotate(Math.PI + winkel,0,0); // 180° , rotationsmittelpunkt 0,0	
		g2d.drawImage(FlugImage, at1, this);		
		
		g.drawLine(0,0,600,600);
		g.drawLine(0,600,600,0);
	}
}
```





```
public class Spiel extends JApplet 
{

	JPanel jPanel_main = new JPanel();
    JPanel jPanel_spielfeld = new JPanel();
    JPanel jPanel_controlfeld = new JPanel();

	
	/**Das Applet konstruieren*/    
	public Spiel() { }; 
    
    public void init()
    {
          try { layoutInit(); }
          catch(Exception e){ }
    }
    
    /**Initialisierung der Komponenten*/
    private void layoutInit() throws Exception
    {
    	this.setSize(new Dimension(800,600));
    	//this.getContentPane().add(jPanel_main,  null);    	
    	this.getContentPane().add( new Raumschiff()); 
    	jPanel_main.setLayout( new BorderLayout() );
    	jPanel_main.setBorder (new LineBorder (Color.gray));
    	
    	jPanel_main.add(jPanel_spielfeld, BorderLayout.WEST);
    	jPanel_main.add(jPanel_controlfeld, BorderLayout.EAST);    	
    	
    	  	
    	
    	jPanel_spielfeld.setPreferredSize(new Dimension(600,600));
    	jPanel_spielfeld.setBorder (new LineBorder (Color.gray));
    	jPanel_spielfeld.setBackground(Color.white);
    	
    	jPanel_controlfeld.setPreferredSize(new Dimension(200,600));
    	jPanel_controlfeld.setBorder (new LineBorder (Color.gray));
    	jPanel_controlfeld.setBackground(Color.white);
    	jPanel_controlfeld.setLayout( new BorderLayout(2,2) );    	
    	
    	//jPanel_spielfeld.add(new Raumschiff());
    	
    	
    	
    	
    }
```

wie füge ich nun  am besten die Klasse Raumschiff in die Klasse Spiel ein.

Ich habe es mal probehalber mit  this.getContentPane().add( new Raumschiff());  eingefügt , nur das hier keine Bilder und Sounds geladen werden.

Mir wäre es am liebsten die  Klasse Raumschiff würde in jPanel_spielfeld auftauchen.


----------



## Quaxli (16. Aug 2007)

So gar nicht. 

Guck mal auf www.cokeandcode.com da gibt's ein paar gute Tutorials zur Spieleprogrammierung (allerdings auf englisch). Dort werden zwar keine Applets programmiert sondern eigenständige Applikationen, aber abgesehen von der Anzeigevariante ist der Aufbau immer der Gleiche.
Dort kannst Du Dir mal die Grundlagen zur Spieleprogrammierung rein ziehen.


----------



## Blind (16. Aug 2007)

danke , aber das kannte ich schon , da hab ich mir auch schon den kopf zerbrochen wie man dieses in ein echtes applet umwandelt und habs aufgegeben.

denn alle Tutorals für Spielen die als Applikation erstellt wurden , arbeiten mit createBufferStrategy() , und das ist in Applet nach meiner ansicht nicht möglich.

Auch kann man nicht überall einfach mit Graphics arbeiten , das sollte immer in der Methode paint geschehen.
Aber kann auch sein das ich das noch nicht so verstanden habe mit der Appletklasse


----------



## Quaxli (17. Aug 2007)

Doch man kann überall mit Graphics arbeiten - muß es eigentlich sogar. Anders bekommst Du kein effektives Spiel hin. Dieser Ansatz von Dir mit 2 Applets und die dann immer ineinder zu frickeln haut nicht hin.

Es geht momentan auch nicht wirklich um die Doppelbufferung. Das kannst Du mit einem einfachen JPanel erschlagen, daß Du in Dein Applet addest, es geht um Dein grundsätzliches Konzept mit 2 Applets.

Versuche folgendes:
- das Applet ist nur der "Rahmen"
- Dein eigentliches "Spielfeld"/Programm erbt von JPanel, damit hast Du auch gleich eine doppelt gepufferte Komponente und brauchst kein BufferStrategy
- dieses "Spielfeld" addest Du in Dein Applet
- sämtliche Logik/Spielschleife implementierst Du im JPanel (nenne ich ab sofort mal Spielfeld)
- in dem Spielfeld überschreibst Du die paint-Methode bzw. paintComponent-Methode

Für alle Objekte die Du zeichnen willst, solltest Du eigene Klassen bauen. Nehmen wir an, Du hast eine Klasse "Feind", dann wirst Du auch dort gewisse Logiken und sonstige Mehtode ablegen. Auf jeden Fall sollte die Klasse eine Methode haben, die z. B. paintEnemey(Graphics g) lautet.
Aus der überschriebenen paint-Methode deines Spielfeldes rufst Du dann für alle Objekte der Klasse Enemy die Methode paintEnemy auf und übergibst das Graphics-Objekt, damit diese da rein malen.

Dieser Ansatz wie man eine Spielschleife aufbaut und für verschiedene Objekte eigene Klassen anlegt und diese dann in der paint-Methode des Spielfeldes zeichnen läßt, das war eigentlich der Teil, den Du Dir im Tutorial bei CodeanCoke mal ansehen solltest. Vergiß mal den Teil mit der Doppelbufferung und ließ das Tutorial mal weiter.


----------

