# frage zu tutorial



## Guest (13. Feb 2008)

hallo
ich habe mir ein tutorial zur spieleentwicklung angeschaut, bei dem in einem applet ein kreis von links nach rechts bewegt wird.

jetzt hab ich mal ein bischen rumgespielt und einen 2 kreis hinzugefügt. ich wollte diesen auf einer kreisbahnlaufen lassen. allerdings hab ich das bisher erst für eine viertelkreis bewegung geschafft, wenn ich in die run() methode mehr code einfüge, etwa mit if abfragen bewegt sich keiner der kreise mehr. hier der code:

```
import java.applet.*;
import java.awt.*;

public class BallBewegungDoppel extends Applet implements Runnable
{
	// Initialisierung der Variablen
	int x_pos = 10;		// x - Position des Balles
	int y_pos = 100;	// y - Position des Balles
	int radius = 20;    // Radius des Balles
	
	int x2_pos = 10;
	int y2_pos = 50;
	int radius2 = 15;
	int kreisR = 60;

	// Variablen für die Doppelpufferung
	private Image dbImage;
	private Graphics dbg;

	public void init()
	{
		setBackground (Color.blue);
	}

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

	public void stop()
	{

	}

	public void destroy()
	{

	}

	public void run ()
	{
		// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
		boolean b = true;
		// Solange true ist läuft der Thread weiter
		while (true)
		{
			// Verändern der x- Koordinate
			if (x2_pos == kreisR) b = !b;
			//if (b) x2_pos++;
			//if (b) x2_pos--; 
			
			y2_pos = pos(x2_pos);
			
			
			
			// Neuzeichnen des Applets
			repaint();

			try
			{
				// Stoppen des Threads für in Klammern angegebene Millisekunden
				Thread.sleep (20);
			}
			catch (InterruptedException ex)
			{
				// do nothing
			}

			// Zurücksetzen der ThreadPriority auf Maximalwert
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		}
	}

	/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
	public void update (Graphics g)
	{
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}

	public void paint (Graphics g)
	{
		g.setColor  (Color.red);

		g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
		
		g.setColor(Color.yellow);
		
		g.fillOval (x2_pos - radius, y2_pos - radius2, 2 * radius2, 2 * radius2);
	}
	
	int pos(int x) {
		
		 return (int) Math.sqrt((kreisR*kreisR) - (x*x));
	}
}
```

meine frage: wieso passiert da nix mehr ?  abgeändert habe ich nur was in der run methode und die methode pos ist von mir, der rest ist eins zu eins aus dem tutorial


----------



## Guest (13. Feb 2008)

huch ich vergaß zeile 54 55 auszukommentieren, also denkt euch die // weg


----------



## Marco13 (13. Feb 2008)

Wenn b true ist, wird dann x2_pos um 1 erhöht, und dann um 1 verringert.

_wenn ich in die run() methode mehr code einfüge, etwa mit if abfragen bewegt sich keiner der kreise mehr._

Ei-ja, das darfste halt nicht machen  :noe: da einfach code einfügen - auch noch mit if-Abfragen :shock: Ganz schlimm  :autsch: 

Mal im ernst: Du hast dir wohl nicht so genau überlegt, was da ablaufen soll. Und spätestens wenn du mal 50 Kreise haben willst, und dann Variablen 'x1_pos' bis 'x50_pos' da stehen hast, wird's richtig unschön. 

Kannst ja mal über eine Klasse "Kreis" nachdenken, oder mal http://www.java-forum.org/de/topic57730_versuch-eines-deutschen-tutorials.html lesen oder so...


----------



## Guest (14. Feb 2008)

jutjut. habs aber dennoch so gescahfft, aber kann mir vorstellen dass für 50 kreise nicht mehr klappt 

```
import java.applet.*;
import java.awt.*;

public class BallBewegungDoppel extends Applet implements Runnable
{
	// Initialisierung der Variablen
	int x_pos = 10;		// x - Position des Balles
	int y_pos = 100;	// y - Position des Balles
	int radius = 20;    // Radius des Balles
	
	int x2_pos = 70;
	int y2_pos = 100;
	int radius2 = 15;
	int kreisR = 50;
	int x0 = 70, y0 = 50;

	// Variablen für die Doppelpufferung
	private Image dbImage;
	private Graphics dbg;

	public void init()
	{
		setBackground (Color.blue);
	}

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

	public void stop()
	{

	}

	public void destroy()
	{

	}

	public void run ()
	{
		// Erniedrigen der ThreadPriority um zeichnen zu erleichtern
		Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
		boolean r = true, o = true;
		// Solange true ist läuft der Thread weiter
		while (true)
		{
			// Verändern der x- Koordinate
			
						
			if (r && o) {
				x2_pos++;	y2_pos = y0+pos(x2_pos);
				if (x2_pos == kreisR + x0) r = false;
			}
			else if (!r && o) {
				x2_pos--; y2_pos = y0-pos(x2_pos);
				if(x2_pos == x0) o = false;
			}
			else if (!r && !o) {
				x2_pos--; y2_pos = y0-pos(x2_pos);
				if(x2_pos == x0 -kreisR) r = true;
			}
			else if (r && !o) {
				x2_pos++; y2_pos = y0+pos(x2_pos);
				if(x2_pos == x0) o = true;
			}
			
			x_pos++;
						
			
			// Neuzeichnen des Applets
			repaint();

			try
			{
				// Stoppen des Threads für in Klammern angegebene Millisekunden
				Thread.sleep (20);
			}
			catch (InterruptedException ex)
			{
				// do nothing
			}

			// Zurücksetzen der ThreadPriority auf Maximalwert
			Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
		}
	}

	/** Update - Methode, Realisierung der Doppelpufferung zur Reduzierung des Bildschirmflackerns */
	public void update (Graphics g)
	{
		// Initialisierung des DoubleBuffers
		if (dbImage == null)
		{
			dbImage = createImage (this.getSize().width, this.getSize().height);
			dbg = dbImage.getGraphics ();
		}

		// Bildschirm im Hintergrund löschen
		dbg.setColor (getBackground ());
		dbg.fillRect (0, 0, this.getSize().width, this.getSize().height);

		// Auf gelöschten Hintergrund Vordergrund zeichnen
		dbg.setColor (getForeground());
		paint (dbg);

		// Nun fertig gezeichnetes Bild Offscreen auf dem richtigen Bildschirm anzeigen
		g.drawImage (dbImage, 0, 0, this);
	}

	public void paint (Graphics g)
	{
		g.setColor  (Color.red);

		g.fillOval (x_pos - radius, y_pos - radius, 2 * radius, 2 * radius);
		
		g.setColor(Color.yellow);
		
		g.fillOval (x2_pos - radius, y2_pos - radius2, 2 * radius2, 2 * radius2);
	}
	
	void bewegeKreis(int x0, int y0, int r) {
		
		
	}
	
	int pos(int x) {
		
		 return (int) Math.sqrt((kreisR*kreisR) - ((x-x0)*(x-x0)) ) ;
	}
}
```
ein kreis der sich auf einer kreisbahn bewegt und einer der von links nach rechts fliegt, ... und ich hab 8 ifs in der run


----------

