# Brauche Hilfe bei kleinem Spiel



## nicylein22 (30. Apr 2009)

Hallo ihr Lieben,

ich hab ein riesen Problem und komm absolut nicht weiter.
Ich muss ein kleines "Spiel" programmieren bei dem ein Ball im Frame immer durchhüpft.

Der Spieler ist ein kleines Bildchen, und das soll nun mit den Tasten a,w,s,y gesteuert werden (wollte eigentlich die Pfeiltasten aber das krieg ich gar nich hin).

Mein Code ist fehlerfrei, sagt mir zumindest mein Eclipse.

Ich hoffe ihr könnt mir sagen wo mein Fehler liegt.

Besten Dank schon mal.
	
	
	
	





```
package meins;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class MoveBall extends Frame implements KeyListener, ActionListener{

	/**
	 * Ballbewegung
	 */
	Ball b;
	Thread f;
	int m=80, n=80;
	int x=0; int y=250; 
	int x1; int y1;
	int s=1;
	
	boolean r=true; //Schalter für die x Richtung
	boolean t=true; //Schalter für die y Richtung
	Random r1; Random r2; //Zufallszahlen
	Image img; //Bild
	
	public MoveBall(){
		//Frame aufbauen
		setSize(500,500);
		setLocation(100,100);
		setTitle("Spiel");
		setVisible(true);
		b=new Ball();
		r1=new Random();
		r2= new Random();
		f=new Thread();
		f.start();
		addKeyListener(this);
	}
	
	public void paint(Graphics g){ 
        img = getToolkit().getImage("ball.jpg");         
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img, 2);
        
		
        for(;;){ 
        //g.clearRect(0,0,500,500); 
        g.drawImage(img,m,n,this);
      //malen 
        
        b.draw(g, x, y); 
        try{Thread.sleep(2);} catch(Exception z){} 
         
        if(x>=500){
            r=false;
             x1 = r1.nextInt(4);
             y1 = r2.nextInt(4);
           } 
           if(x<=0){
            r=true;
             x1 = r1.nextInt(4);
             y1 = r2.nextInt(4);
           }
           if(y>=500){
            t=false;
             x1 = r1.nextInt(4);
             y1 = r2.nextInt(4);
           } 
           if(y<=0){
            t=true; 
             x1 = r1.nextInt(4);
             y1 = r2.nextInt(4);
           } 
         
         if(r){ //Ball nach rechts 
        	 
              x= x+ x1; // neu positionieren 
              if(t){
               y=y+2;
              }
              else {
               y--;  
              }
              //malen 
              b.draw(g, x, y); 
               
         } 
         else{ //Ball nach links 
        	  x=x -x1; 
              if(t){
               y=y+2;
              }
              else {
               y--;  
              }
              //malen 
              b.draw(g, x, y); 
               
        
         }         
     } 
}
	

	
	public void run(){
		for(;;){
			switch(s){
			case 1: m=m-10; repaint(); break;
			case 2: m=m+10; repaint(); break;
			case 3: n=n-10; repaint(); break;
			case 4: n=n+10; repaint(); break;
			
			}
			repaint();	
			try{Thread.sleep(5);} catch(Exception z){}
		}
		
	}
	public static void main(String[] args) {
		new MoveBall();

	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyChar()=='a')s=1;
		if (e.getKeyChar()=='s')s=2;
		if (e.getKeyChar()=='w')s=3;
		if (e.getKeyChar()=='y')s=4;
		
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getKeyChar()=='a')s=1;
		if (e.getKeyChar()=='s')s=2;
		if (e.getKeyChar()=='w')s=3;
		if (e.getKeyChar()=='y')s=4;
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) { }

	@Override
	public void actionPerformed(ActionEvent arg0) { }

}
```


----------



## SlaterB (30. Apr 2009)

das Bild genau EINMAL laden, nicht geschätzt 50x pro Sekunde für jedes paint,
aber du hast dein paint eh eher so aufgebaut, als wenn das nur einmal aufgerufen wird und dann in einer Endlosschleife arbeitet, 
so gehts aber nicht,
paint muss kurz und schnell sein, solange eine paint-Methode aktiv ist, wird nichts anderes gemalt um die ganze GUI blockiert,

deine Spiel-Aktion muss in einem separaten Thread stattfinden, die alle x ms repaint() aufruft,

suche dir entsprechende Tutorials zu Zeichen in AWT/ Swing,
hier mal bisschen was
Supporting User Interaction (The Java™ Tutorials > 2D Graphics > Advanced Topics in Java2D)


----------



## Schandro (30. Apr 2009)

Was ist dein Problem? Bitte immer komplette Fehlerbeschreibungen (plus StackTrace / Exception wenn vorhanden) posten.


----------



## nicylein22 (30. Apr 2009)

Hallo,

danke für eure Antworten.

Mein Problem ist, dass ich mein Bild, welches ich hier "mal"


```
img = getToolkit().getImage("ball.jpg");         
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img, 2);
        
		
        for(;;){ 
        //g.clearRect(0,0,500,500); 
        g.drawImage(img,m,n,this);
```

nicht mit den Tasten bewegen kann.

Tut mir wirklich leid wenn ich mich so dumm anstell, aber ich bin absoluter Anfänger, ändert aber leider nix dran, dass ich das irgendwie hinkriegen muss.


Und wie gesagt, Eclipse zeigt mir keine Fehlermeldung an.


----------



## SlaterB (30. Apr 2009)

die Fehler habe ich beschrieben, Umsetzung erfordert natürlich relativ hohe Kenntnisse

ein Anfänger muss ein derartiges Programm nicht schreiben, außer für einen sadistischen Lehrer,
und dann sollte man das auch nicht unterstützen


----------



## nicylein22 (30. Apr 2009)

Hallo,

naja, ich kanns mir aber leider nicht aussuchen, ob ichs mach oder nicht.
Weil ichs einfachen machen muss.

Und bei anderen Sachen hat das mit dem Bewegen von Objekten ja schon geklappt, nur bei dem Bild nun eben nicht... :/


----------



## Schandro (30. Apr 2009)

> Und bei anderen Sachen hat das mit dem Bewegen von Objekten ja schon geklappt, nur bei dem Bild nun eben nicht... :/


Dann ersetz doch das Bild mal durch einen Kreis. Wenn dieser sich auch nicht bewegt:
Schreib in die paint Methode ein paar System.out.println Aufrufe die die variablen m,n usw.. ausgeben. Sind diese richtig?


----------



## nicylein22 (30. Apr 2009)

Hallo,

ja, mit einem Rechteck zb gehts auch nicht.

Und wenn ich syso m und n mache
dann schreibt er mir in die Konsole immer 80 ganz oft.

Aber die Variablen m und n ändern sich nicht wenn ich die Tasten drücke.


----------



## Schandro (30. Apr 2009)

> f=new Thread();
> f.start();


Du kannst zwar einen neuen Thread ohne Runnable-Object erschaffen, aber dieser führt dann natürlich nichts aus wenn du ihn startest. Du musst ein Runnable-Object mitgeben. In deinem Fall heisst das:


> f=new Thread(this);
> f.start();


Warum da "this" stehen muss und warum es besser wäre, ne anonyme Klasse zu benutzen statt das die Haupklasse Runnable implementiert, wirst du merken sobald du ein Kapitel über OO durchliest und es verstehst.


----------



## nicylein22 (30. Apr 2009)

Hallo,

also wenn ich das so abänder, dann verschwindet das rechteck gleich nach links und ist dann weg.
In der Konsole erscheinen Zahlen für m bis minus 8000?


----------



## Schandro (30. Apr 2009)

dein Thread der die Position des "Objectes" verändert arbeitet zu schnell, du musst ihn langsammer machen und auch eine Kontrolle einbauen das das "Object" nicht außerhalb des Bildschirms gehen kann.


----------



## nicylein22 (30. Apr 2009)

Hm und wie mach ich das?
Ich war so froh dass ich das mit dem bewegenden Ball endlich hinbekommen hab (
Hab natürlich nicht damit gerechnet dass das mit dem Spieler dann so super kompliziert wird.


----------



## Schandro (30. Apr 2009)

Kann es sein das du den Code nicht selber geschrieben hast?  

```
public void run(){
		for(;;){
			switch(s){
			case 1: m=m-10; repaint(); break;
			case 2: m=m+10; repaint(); break;
			case 3: n=n-10; repaint(); break;
			case 4: n=n+10; repaint(); break;
			
			}
			repaint();	
			try{Thread.sleep(5);} catch(Exception z){}
		}
		
	}
```
Die Unendlichschleife läuft zu schnell bzw. es wird zuviel zu den Variablen addiert/subtrahiert.

Du brauchst übrigens nur 1x repaint() aufrufen, lass also besser die repaints nach jedem case weg


----------



## nicylein22 (30. Apr 2009)

Hallo,

hab das nun in 100 geändert, aber das Rechteck bewegt sich sofort von allein nach links


----------



## Schandro (30. Apr 2009)

Natürlich bewegt es sich, du hast ja auch die variable s (die einen aussagekräftigeren Namen verdient hätte..) per default auf 1 gesetzt und der KeyListener schaltet sie auch nur zwischen 1 und 4 um, dass heist die Position deines "Objects" wird immer verändert..


----------



## nicylein22 (30. Apr 2009)

aber es soll sich ja nur bewegen wenn ich die Tasten drücke
und nicht von alleine?
Oder hab ich da nun irgendwas falsch verstanden?


----------



## Schandro (30. Apr 2009)

> aber es soll sich ja nur bewegen wenn ich die Tasten drücke
> und nicht von alleine?
> Oder hab ich da nun irgendwas falsch verstanden?


DU bist der Programmierer, DU entscheidest was passiert 
Bei solchen Designfragen gibt es kein "richtig" oder "falsch"


----------



## nicylein22 (30. Apr 2009)

Die Programmiererin bitte +g+

Und ich würde es ja gern entscheiden, aber er lässt mich ja nicht.
Sobald das Fenster aufgeht bewegt sich das Rechteck weg.
Ohne dass ich iwelche Tasten drücke.


----------



## Schandro (30. Apr 2009)

Okay, Programmiererin 

Bis jetzt ist die Bewegung des "Objectes" ja so definiert:
s liegt immer zwischen 1 und 4, was als links, rechts, oben und unten interpretiert wird. Du brauchst also noch einen fünften Status, der für keine Bewegung steht. Dafür würde sich z.b. 0 anbieten, order irgendeine andere Zahl die nicht zwischen 1 und 4 liegt.
Ich benutz im folgenden 0.


Als erstes musst du den Defaultwert der Variable s ändern:
statt

```
int s = 1;
```
schreibst du:

```
int s = 0;
```

Dadurch wird es sich am Anfang nicht bewegen.

Warum?:
weil du im Gameloop-Thread folgendes geschrieben hast:

```
public void run(){
		for(;;){
			switch(s){
			case 1: m=m-10; repaint(); break;
			case 2: m=m+10; repaint(); break;
			case 3: n=n-10; repaint(); break;
			case 4: n=n+10; repaint(); break;
			
			}
			repaint();	
			try{Thread.sleep(5);} catch(Exception z){}
		}
		
	}
```
Es trifft jetzt keiner der 4 cases mehr vor, deswegen wird die Variable m bzw. n nicht verändert.
=> Das "Object" bewegt sich nicht.

Als nächstes musst du einbauen, dass, sobald alle Tasten losgelassen wurden (keyReleased-Methode), s auf 0 gesetzt wird. Das ist der etwas komplexere Teil, ich werd dazu gleich noch was schreiben.


----------



## nicylein22 (30. Apr 2009)

Halli Hallo +g+

okay also bewegt sich nicht mehr.
Bewegt sich allerdings auch nich wenn ich Tasten drücke.

Hab das nun so geändert:


```
@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyChar()=='a')s=1;
		if (e.getKeyChar()=='s')s=2;
		if (e.getKeyChar()=='w')s=3;
		if (e.getKeyChar()=='y')s=4;
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getKeyChar()=='a')s=0;
		if (e.getKeyChar()=='s')s=0;
		if (e.getKeyChar()=='w')s=0;
		if (e.getKeyChar()=='y')s=0;
	}
```


aber das stimmt vermutlich nich gell? *g*


----------



## Schandro (30. Apr 2009)

> aber das stimmt vermutlich nich gell? *g*


Warum, es funktioniert doch ?!


Ich hab mal den Code in keyPressed/keyReleased und in der run-Methode des Threads ein bisschen angepasst:

```
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class MoveBall extends Frame implements Runnable, KeyListener{

	Thread f;
	int m=80, n=80;
	int x=0; int y=250;
	int x1; int y1;
	int s=0;

	boolean r=true; //Schalter für die x Richtung
	boolean t=true; //Schalter für die y Richtung
	Random r1; Random r2; //Zufallszahlen
	Image img; //Bild

	public MoveBall(){
		//Frame aufbauen
		setSize(500,500);
		setLocation(100,100);
		setTitle("Spiel");
		setVisible(true);
		r1=new Random();
		r2= new Random();
		f=new Thread(this);
		f.start();
		addKeyListener(this);
	}

	public void paint(Graphics g){
       g.fillRect(m,n,50,50);
}



	public void run(){
		for(;;){
			System.out.println(m);
			switch(s){
			case 1: m=m-10; break;
			case 2: n=n+10; break;
			case 3: n=n-10; break;
			case 4: m=m+10; break;

			}
			repaint();
			try{Thread.sleep(100);} catch(Exception z){}
		}

	}
	public static void main(String[] args) {
		new MoveBall();

	}

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode()==KeyEvent.VK_A){
			s=1;
		} else if (e.getKeyCode()==KeyEvent.VK_S){
			s=2;
		} else if (e.getKeyCode()==KeyEvent.VK_W){
			s=3;
		} else if (e.getKeyCode()==KeyEvent.VK_D){
			s=4;
		}
	}

	@Override
	public void keyReleased(KeyEvent e) {
		if (e.getKeyCode()==KeyEvent.VK_A){
			s=0;
		} else if (e.getKeyCode()==KeyEvent.VK_S){
			s=0;
		} else if (e.getKeyCode()==KeyEvent.VK_W){
			s=0;
		} else if (e.getKeyCode()==KeyEvent.VK_D){
			s=0;
		}
	}

	@Override
	public void keyTyped(KeyEvent arg0) { }


}
```



> e.getKeyCode()==KeyEvent.VK_W


Funktioniert genauso wie 
e.getKeyChar() == 'w'
mann kan damit aber auch sachen wie die Pfeiltasten, Escape, Shift usw. abfragen.. Einfach in der API unter der Klasse KeyEvent die passende Konstante suchen.


----------



## nicylein22 (30. Apr 2009)

Hey 
danke das Bewegen funktioniert

und kann ich meinen Ball nu einfach wieder da einfügen wo ich ihn schon hatte?
Also den ball der sich immer bewegt ?


----------



## Schandro (30. Apr 2009)

Du meinst die Unendlichschleife und das aufrufen von Thread.sleep(2); in der paint-Methode? Nein, auf keinen Fall. In die paint Methode gehören sowas nicht, die paint Methode ist nur zum malen da, nicht um irgendwelche Variablen zu ändern, 2 milisekunden zu warten und übrigens auch nicht um ein Bild von der Festplatte zu laden 

Du musst den Ball genauso wie die Spielfigur "bewegen", dass heisst ein paar Membervariablen die von einem Thread verändert werden und die in der paint Methode benutzt werden um den Ball an eine bestimmte Position zu malen.
Tu am besten die berechnung der Ballbewegung in die selbe Schleife in der du bereits die Bewegung der Spielfigur berechnest.


----------



## nicylein22 (30. Apr 2009)

Achso hm du meinst ich soll


```
if(x>=500){
           r=false;
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          } 
          if(x<=0){
           r=true;
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          }
          if(y>=500){
           t=false;
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          } 
          if(y<=0){
           t=true; 
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          } 
        
        if(r){ //Ball nach rechts 
          
             x= x+ x1; // neu positionieren 
             if(t){
              y=y+2;
             }
             else {
              y--;  
             }
             //malen 
             b.draw(g, x, y); 
              
        } 
        else{ //Ball nach links 
           x=x -x1; 
             if(t){
              y=y+2;
             }
             else {
              y--;  
             }
             //malen 
             b.draw(g, x, y);
```

in die Klasse "Ball" reinschreiben oder wie?

Und dann in Paint nur mit b.draw aufrufen? 
versteh ich nich so, weil das mit dem Ball funktionierte bisher ja


----------



## Schandro (30. Apr 2009)

Ich kenn die "Ball" Klasse nicht, du hast sie bis jetzt noch nicht gepostet 


```
versteh ich nich so, weil das mit dem Ball funktionierte bisher ja
```
Es hat zwar funktioniert, war aber eine extrem unsaubere Lösung und irgendwann später hättest du mit Sicherheit Probleme damit bekommen.


----------



## nicylein22 (30. Apr 2009)

Achso sorry, natürlich
die Klasse Ball ist hier:


```
package meins;

import java.awt.*;


public class Ball {
	int radius; Color c;
	
	public Ball(){
		radius=15; c=new Color(0,0,0);
	}
	void draw(Graphics g, int x, int y){
		g.setColor(c);
		g.fillOval(x-radius,y-radius,2*radius,2*radius);
		
	}

}
```


----------



## Schandro (30. Apr 2009)

gut. :toll:

Als erstes würd ich die int's, die für die Postition des Balls stehen, auch in die Klasse Ball tun und die draw Methode entsprechend anpassen:


```
public class Ball {

    int radius;
    int positionX;
    int positionY;
    Color c;
    
    public Ball(){
        radius=15; 
        c=new Color(0,0,0);
    }
    
    void draw(Graphics g){
        g.setColor(c);
        g.fillOval(positionX-radius,positionY-radius,2*radius,2*radius);
    }
}
```

In der Hauptklasse "MoveBall" hast du ja als Membervariable eine Instanz von "Ball". Nennen wie sie mal "myBall".

Jetzt kannst du die run()-Methode, die im Thread ausgeführt wird, um die Bewegungslogik des Balls erweitern. (z.b. zwischen den switch-Block und den repaint()-Aufruf).
Diese dient natürlich nur dazu, um myBall.positionX bzw. myBall.positionY zu verändern

Innerhalb der paint-Methode brauchst du dann nurnoch schreiben:
myBall.draw(g);


----------



## nicylein22 (30. Apr 2009)

Hmm hört sich gut an, aber wo und wie schreib ich das mit dem myball rein?! +g+


----------



## Schandro (30. Apr 2009)

Hier nochmal der Code der Hauptklasse, um einen Ball mit einfacher Bewegung erweitert:

```
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class MoveBall extends Frame implements Runnable, KeyListener{

    Thread f;
    int m=80, n=80;
    int x=0; int y=250;
    int x1; int y1;
    int s=0;

    boolean r=true; //Schalter für die x Richtung
    boolean t=true; //Schalter für die y Richtung
    Random r1; Random r2; //Zufallszahlen
    Image img; //Bild

    Ball myBall = new Ball();

    public MoveBall(){
        //Frame aufbauen
        setSize(500,500);
        setLocation(100,100);
        setTitle("Spiel");
        setVisible(true);
        r1=new Random();
        r2= new Random();
        f=new Thread(this);
        f.start();
        addKeyListener(this);
    }

    public void paint(Graphics g){
       g.fillRect(m,n,50,50);
       myBall.draw(g);
}



    public void run(){
        for(;;){

            // bewegungslogik der Spielfigur
            switch(s){
				case 1: m=m-10; break;
				case 2: n=n+10; break;
				case 3: n=n-10; break;
				case 4: m=m+10; break;
            }

			// bewegungslogik des Balls
            myBall.positionX += 5;
            myBall.positionY += 5;


			// neuzeichnen und warten
            repaint();
            try{Thread.sleep(100);} catch(Exception z){}
        }
    }
    public static void main(String[] args) {
        new MoveBall();

    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_A){
            s=1;
        } else if (e.getKeyCode()==KeyEvent.VK_S){
            s=2;
        } else if (e.getKeyCode()==KeyEvent.VK_W){
            s=3;
        } else if (e.getKeyCode()==KeyEvent.VK_D){
            s=4;
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
        if (e.getKeyCode()==KeyEvent.VK_A){
            s=0;
        } else if (e.getKeyCode()==KeyEvent.VK_S){
            s=0;
        } else if (e.getKeyCode()==KeyEvent.VK_W){
            s=0;
        } else if (e.getKeyCode()==KeyEvent.VK_D){
            s=0;
        }
    }

    @Override
    public void keyTyped(KeyEvent arg0) { }


}
```


----------



## nicylein22 (30. Apr 2009)

Hmm danke das klappt aber mein Ball fliegt jetzt zu den Grenzen immer raus


----------



## Schandro (30. Apr 2009)

Jep, deswegen hab ich ja geschrieben "mit einfacher Bewegung". Wie genau sich der Ball bewegen soll musst du coden. Ich weiß ja nicht wie er sich Verhalten soll.


----------



## nicylein22 (30. Apr 2009)

Achsooo... naja so wie ichs hatte


```
if(x>=500){
           r=false;
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          } 
          if(x<=200){
           r=true;
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          }
          if(y>=500){
           t=false;
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          } 
          if(y<=25){
           t=true; 
            x1 = r1.nextInt(4);
            y1 = r2.nextInt(4);
          } 
        
        if(r){ //Ball nach rechts 
          
             x= x+ x1; // neu positionieren 
             if(t){
              y=y+2;
             }
             else {
              y--;  
             }
             //malen 
             b.draw(g, x, y); 
              
        } 
        else{ //Ball nach links 
           x=x -x1; 
             if(t){
              y=y+2;
             }
             else {
              y--;  
             }
             //malen 
             b.draw(g, x, y); 
              
       
        }
```

in dem Bereich immer von einer Wand zur andern jeweils mit nem Zufallswinkel halt.

Und das mit den Pfeiltasten hab ich hinbekommen +g+ kleine Freude


----------



## nicylein22 (1. Mai 2009)

Hallo,
ich bins nochmal.

Also ich krieg das so mit meim Teil wie der Ball sich im Frame beweg nicht mehr in deinen Code rein.

Hast du vielleicht ne Idee wie ich das anders einbauen könnte?

Liebe Grüße und n schönen Feiertag.


----------



## Schandro (1. Mai 2009)

Wo ist den das Problem? du musst nur über irgendwelche if-Abfragen (und vllt. noch ein paar weitere Membervariablen) die Variablen myBall.positionX und myBall.positionY verändern. Natürlich kommt der malen-Code nichtmehr darein, der steht ja jetzt in der paint-Methode... (woanders macht er auch keinen Sinn)


----------



## nicylein22 (1. Mai 2009)

Naja mein Problem liegt darin, dass ich nich genau weiss wo ichs reinschreiben soll und, wie ich meinen Code von oben so ändern muss dass deine Variablen drin sind und dass ich nich weiß ob ich meinen Code überhaupt noch benutzen kann ?!
Also den von oben.


----------



## nicylein22 (2. Mai 2009)

Hey,

ich denk mal ich muss die Spielfeldbegrenzung in der sich der Ball bewegen muss hier einbauen:


```
// bewegungslogik des Balls
            
            myBall.positionX += 5;
            myBall.positionY += 5;
            
 
 
            // neuzeichnen und warten
            repaint();
            try{Thread.sleep(100);} catch(Exception z){}
            }
```

unter positionX

Aber mir is nicht mehr so ganz klar was mit dem myBall..... bewirkt wird.
Kannst du mir das noch mal sagen, bzw sagn wie ich meine Begrenzung da einbau?
Ich brauch das dann ja für die Spielfigur selber auch.

Danke schon mal.


----------



## Schandro (2. Mai 2009)

durch
myBall.positionX
greifst du auf den int "positionX" von "myBall" zu. Wie genau das funktioniert lernste in einem Kapitel über Objekt Orientierung...

Ich versteh echt nicht was jetzt das Problem mit der Bewegungslogik ist, du hast doch bereits schonmal so was ähnliches geschrieben.

Wenn du z.b. willst, das sich der Ball abwechselnd von links nach rechts bewegt, brauchst du als erstes ne Membervariable
boolean ballBewegtSichNachRechts = true;

und als Bewegungslogik schreibst du dann:

```
if(myBall.positionX > 500){ // 500 = rechte Grenze
	ballBewegtSichNachRechts = false;
}
else if(myBall.positionX < 0){ // 0 = linke Grenze
	ballBewegtSichNachRechts = true;
}

if(ballBewegtSichNachRechts){
	myBall.positionX += 5;
}
else{
	myBall.positionX -= 5;
}
```


----------



## nicylein22 (3. Mai 2009)

Tut mir echt leid wenn ich dich so nerv, aber ich bin da irgendwie n bissl durcheinander 

Ich hab dein code von oben nun in die runmethode geschrieben.
Wenn ichs aber ausführ erscheint gar kein Ball mehr?
Nur noch mein Spieler.


----------



## nicylein22 (3. Mai 2009)

Sorry !!
Ich hab das nun so gelöst:


```
if(myBall.positionX >=500){
            	ballBewegtSichNachRechts=false;
                 x1 = r1.nextInt(4);
                 y1 = r2.nextInt(4);
               } 
               if(myBall.positionX <=0){
                ballBewegtSichNachRechts=true;
                 x1 = r1.nextInt(4);
                 y1 = r2.nextInt(4);
               }
               if(myBall.positionY>=500){
                t=false;
                 x1 = r1.nextInt(4);
                 y1 = r2.nextInt(4);
               } 
               if(myBall.positionY<=0){
                t=true; 
                 x1 = r1.nextInt(4);
                 y1 = r2.nextInt(4);
               } 
             
             if(ballBewegtSichNachRechts){ //Ball nach rechts 
               
                  myBall.positionX= myBall.positionX+ x1; // neu positionieren 
                  if(t){
                   myBall.positionY=myBall.positionY+2;
                  }
                  else {
                   myBall.positionY--;  
                  }
                  //malen 
                  //b.draw(g, x, y); 
                   
             } 
             else{ //Ball nach links 
                myBall.positionX=myBall.positionX -x1; 
                  if(t){
                   myBall.positionY=myBall.positionY+2;
                  }
                  else {
                   myBall.positionY--;  
                  }
                  //malen 
                  //b.draw(g, x, y);
```

und der Ball bewegt sich.
Hast du noch n Tipp für mich wie ich den Ball schneller fliegen lassen kann?!

Grüßle


----------



## Schandro (3. Mai 2009)

schneller wird der Ball entweder dadurch, das du zu positionX bzw. positionY größere Zahlen addierst.

Oder indem du die millisekunden bei Thread.sleep verringerst, dann wird aber auch alles andere schneller.


----------



## nicylein22 (3. Mai 2009)

Okay alles klar. Danke.

Und die Spielfigur, begrenz ich die genau so wie den Ball ?!


----------

