# Sprung stoppen



## Marie97 (27. Jan 2015)

Hallo,
ich bin gerade dabei ein kleines Jump n Run Spiel zu programmieren. Ich möchte das der Charakter auf einen Block springen kann. Dafür muss ich die Bewegung des Sprunges stoppen, damit er nicht durch den Block fällt. Habt ihr da einen Rat für mich?
LG Marie


----------



## Java20134 (27. Jan 2015)

Um dir bei deinem Problem zu helfen, brauchen wir den Quellcode, um die sicher zusagen was da machbar ist. 
Aber so aus meiner bisherigen Erfahrung, überprüfst du ja irgendwie, ob eine Variable einen Wert hat und wenn ja, dann soll die Sprungposition eine gewissen x-Wert nach unten gesetzt werden. Und die Bedingung muss dann einfach false sein.


----------



## Marie97 (28. Jan 2015)

So das ist meine Sprung Klasse, ich sehe selber das dort Fehler sind z.B habe ich blöderweise die Sprunghöhe beschränkt , was ich gar nicht will... Ich habe noch nicht so viel Java Erfahrung und habe das Springen anhand eines Videos programmiert.

```
//Der Charakter bekommt Springen als Eigenschaft zugewiesen.
public class Sprung extends Thread{
	
	//Variablen werden festgelegt.
	static boolean amBoden = true;
	static boolean höchsterSprungpunkt = false;
	int Sprunghöhe = 85;
	static int UrsprungY = 235;
	static int Sprungposition = UrsprungY;
	
	public Sprung(){
	}
	
	public void run(){
		amBoden = false;	
		//Eine Variable für die Verzögerung des Sprunges wird festgelegt.
		int VerlangsamungdesSprungs = 5;
		//Während der Charakter sich nicht am Boden befindet, wird gesprungen. 
		while(amBoden == false){
			sprung();
			try{
				Thread.sleep(VerlangsamungdesSprungs);
				}
			catch(Exception e){
			}
	
		}
		höchsterSprungpunkt = false;
	}
	public void sprung(){
		//Der Charakter springt solange, bis der höchste Sprungpunkt erreicht wird.
		if(höchsterSprungpunkt == false){
			Sprungposition--;
		}
		//Es wird festgelegt, wann der höchste Sprungpunkt erreicht wird.
		if(Sprungposition == (UrsprungY - Sprunghöhe)){
			höchsterSprungpunkt = true;
		}
		//Der Charakter fällt, sobald der höchste Sprungpunkt erreicht wurde.
		if(höchsterSprungpunkt == true && Sprungposition <= UrsprungY){
			Sprungposition ++;
		}
		//Der Charakter befindet sich wieder am Boden.
		if(Sprungposition == UrsprungY){
			amBoden = true;
		}
	}
}
```

So und das ist die Klasse vom Block, da habe ich noch die Sprungposition festgelegt sobald der Block angesprungen ist, das ist auch mein Problem. Wenn ich eine feste Sprungposition zuweise, kann ich die natürlich nicht verändern solange ich den Block berühre.

```
//Befehle werden importiert.
import javax.swing.JFrame;

//Ein Block, gegen den man springen muss, soll erstellt werden.
public class Block {

//Zustandsvariablen für den Block werden festgelegt.
final int X;
final int Y;
final int Width, Height;
boolean coin = false;
static boolean aufBlock;

	//Dem Block werden Parameter-Werte übergeben.
	public Block(int p_x, int p_y, int p_width, int p_height){
	//Variablen für den Block werden festgelegt.
	X = p_x;
	Y = p_y;
	Width = p_width;
	Height = p_height;
	}
	
	//Die Kollisionsabfrage überprüft, wo sich die x und y Koordinaten des Blockes und des Charakters befinden.
	public boolean Kollisionsabfrage_für_Coin(int x_block, int y_block, int x_charakter, int y_charakter){
	
		
		//Man kann auf den Block springen.
		if(x_charakter >= x_block && y_charakter <= y_block-Height-Height){
			if(x_charakter <= x_block + Width){	
				Sprung.Sprungposition = y_block-125;
			}
			else{
				if(x_charakter - 40 <= x_block + Width){
					Sprung.Sprungposition = y_block-125;
				}		
			}
		}
```

@Java20134: Ich habe das mit der Bedingung probiert und dann festgestellt, das meine Sprung-Klasse fehlerhaft ist.


----------



## Java20134 (28. Jan 2015)

Naja und wenn du jetzt auf den Block kommst, dann hast du einen y-Wert. Und wenn der Wert erreicht ist, dann setzt du amBoden auf true.


----------



## Marie97 (28. Jan 2015)

Das hatte ich auch bereits ausprobiert, aber dann sinkt der Charakter ja nicht mehr runter es sei den ich drücke die Sprung Taste erneut. Und auf dem Block kann ich nicht springen.


----------



## Marie97 (28. Jan 2015)

Okay also auf dem Block springen klappt jetzt  Ich müsste dann nur noch wissen, wie ich das mache das er wieder runter sinkt, wenn ich den Block verlasse.
Aber vielen Dank schon mal


----------



## Bananabert (29. Jan 2015)

Du prüfst ob unter dem Spieler ein fester Block ist. Sollte dies nicht der Fall sein, addierst/subtrahierst du deinen Y-Wert um einen bestimmten Betrag.
Hier ein kleines Bespiel aus meinem ersten Jump 'n Run. Die Geschwindkeit mit der der Spieler fällt wir langsam erhöht bis zu einem gewissen Punkt.

```
if (isFalling && !isJumping) {
	if(dy <= maxFallSpeed) {
		fallTime += 0.04;
		dy = (fallSpeed * fallTime);
	} else {
		dy = maxFallSpeed;
	}
}
```
dy = Die Geschwindigkeit eines Objekts auf der Y Koordinate.
Der Rest, denke ich, sollte klar sein.


----------



## Marie97 (29. Jan 2015)

Sorry versteh ich nicht  Ich bring mir Java, aber auch erst seit nem Monat bei  Kannst du mir das mit meinen Variablen erklären?


----------



## Bananabert (29. Jan 2015)

Wenn du mir deine Player-Klasse zeigen könntest, wäre es einfacher.

Du müsstest prüfen ob amBoden = false ist, also kein fester Block unter dir ist, und du nicht gerade einen Sprung ausführst.
Trifft dies zu, reduzierst du die y-Koordinate in deiner Spieler-Klasse, bei jedem Update, um einen bestimmtem Wert. Dies machst du so lange, bis dein Spieler wieder einen festen Block unter den Füßen hat.


----------



## Marie97 (31. Jan 2015)

Okay das ist meine komplette Klasse fürs erste Level und die Sprungklasse steht ja oben

```
//Der ActionListener sorgt dafür, dass Funktionen ausgeführt werden können.
public class Level1 extends JPanel implements ActionListener{
	
	//Variablen werden festgelgt. 
	Timer time;
	Image Level1_Hintergrund;
	Image Charakter_links;
	Image Charakter_rechts;
	Image img4;
	Image Fragezeichenblock;
	Image Block;
	Image Taler;
	int key;
	int X_Bild;
	int lauf;
	//X Koordinate des Charakters
	static int left = 0;
	int nx, nx2;
	int anzahl;
	int anzahl2;
	int panda_y = 235;
	Block block1, block2, block3, block4, block5, block6, block7, block8, block9, block10;
	static Taler Taler1, Taler2, Taler3;
	static int coin_score;

	//Das erste Level wird erstellt.
	public Level1(){
		nx = 0;
		//Länge des Bildes
		nx2 = 690;
		key = 0;
		lauf = 0;
		setFocusable(true);
		//Dem Hintergrund wird ein Bild zugewiesen.
		ImageIcon u = new ImageIcon(getClass().getResource("background.jpg"));
		Level1_Hintergrund = u.getImage();
		
		//Dem Charakter wird ein Bild zugewiesen.
		ImageIcon k = new ImageIcon(getClass().getResource("charlinks.jpg"));
		Charakter_links = k.getImage();	
		//Dem Charakter wird ein Bild zugewiesen.
		ImageIcon rechts = new ImageIcon(getClass().getResource("charrechts.jpg"));
		Charakter_rechts = rechts.getImage();
		//Dem Charakter wird ein Bild zugewiesen.
		ImageIcon Normal = new ImageIcon(getClass().getResource("pandavorne.jpg"));
		img4 = Normal.getImage();
		
		//Fragezeichenblock wird gezeichnet.
		ImageIcon Fragezeichen = new ImageIcon(getClass().getResource("BlockFragezeichen.jpg"));
		Fragezeichenblock = Fragezeichen.getImage();
		//Ein Block wird gezeichnet.
		ImageIcon p = new ImageIcon(getClass().getResource("Block.jpg"));
		Block = p.getImage();
		//Bild für Taler
		ImageIcon t = new ImageIcon(getClass().getResource("Taler.png"));
		Taler = t.getImage();
		//Der KeyListener wird hinzugefügt, um auf Tastendrücke zu überprüfen.
		addKeyListener(new AL());
		//Blöcke werden in ihrer Größe, Farbe und Position bestimmt.
		block1 = new Block(0,110,50,50);
		block2 = new Block(1000,270,50,50);
		block3 = new Block(1100,220,50,50);
		block4 = new Block(2500,110,50,50);
		block5 = new Block(3250,110,50,50);
		block6 = new Block(4000,110,50,50);
		block7 = new Block(4750,110,50,50);
		block8 = new Block(5500,110,50,50);
		block9 = new Block(6250,110,50,50);
		block10 = new Block(7000,110,50,50);
		//
		Taler1 = new Taler(500,100,100,100);
		Taler2 = new Taler(4500,100,100,100);
		Taler3 = new Taler(6500,100,100,100);
		//Dem Charakter wird 'Springen' als Eigenschaft zugewiesen.
		Sprung sprung = new Sprung();
		//Ein Timer hinzugefügt, um den Hintergrund alle 5 Sekunden zu aktualisieren.
		time = new Timer(5,this);
		time.start();
		}
	
		//Sobald der Charakter sich von der ursprünglichen Position bewegt, wird er neu gezeichnet.
		public void actionPerformed(ActionEvent l1){
			bewegen();
			panda_y = Sprung.Sprungposition;
			repaint();		
		}
	
		public void paint(Graphics g){
			super.paint(g);
			Graphics2D f2 =(Graphics2D)g;
			//510: Punkt wo der Hintergrund weiß wäre 2350: doppelte Länge des Bildes
			if(getX_Bild() == 510 + (anzahl * 2350)){
				anzahl += 1;
				nx = 0;
			}
			//
			if(getX_Bild() == 1690 + (anzahl2 * 2350)){
				anzahl2 += 1;
				nx2 = 0;
			}
			//
			if(getX_Bild() >= 510){
				f2.drawImage(Level1_Hintergrund, 685 - nx, 0, null);
			}
			//Das Hintergrundbild wird gezeichnet.
			f2.drawImage(Level1_Hintergrund, 685 - nx2,  0, null);
			
			//Der Charakter wird gezeichnet.
			f2.drawImage(img4, left, panda_y, null);
			
			//linke Taste
			if(lauf==-5){
				f2.drawImage(Charakter_links, left, panda_y, null);
			}
			//Rechte Taste
			else if(lauf==5){
				f2.drawImage(Charakter_rechts, left, panda_y, null);		
			}
			//
			
			//Die Blöcke werden gezeichnet.
			f2.drawImage(Fragezeichenblock, block1.getX_Block() - getX_Bild(), block1.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block2.getX_Block() - getX_Bild(), block2.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block3.getX_Block() - getX_Bild(), block3.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block4.getX_Block() - getX_Bild(), block4.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block5.getX_Block() - getX_Bild(), block5.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block6.getX_Block() - getX_Bild(), block6.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block7.getX_Block() - getX_Bild(), block7.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block8.getX_Block() - getX_Bild(), block8.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block9.getX_Block() - getX_Bild(), block9.getY_Block(), null);
			f2.drawImage(Fragezeichenblock, block10.getX_Block() - getX_Bild(), block10.getY_Block(),null);
			//Die Taler werden gezeichnet. 
			f2.drawImage(Taler, Taler1.getX_Taler() - getX_Bild(), Taler1.getY_Taler(), null);
			f2.drawImage(Taler, Taler2.getX_Taler() - getX_Bild(), Taler2.getY_Taler(), null);
			f2.drawImage(Taler, Taler3.getX_Taler() - getX_Bild(), Taler3.getY_Taler(), null);
			
			coin_score = 0;	
			//Wird ein Block angesprungen, erhöht der 'Score' sich um 1.
			block1.Kollisionsabfrage_für_Coin(block1.getX_Block() - getX_Bild(),block1.getY_Block() + block1.getHeight(), left + (74 - 12), panda_y );{
				if(block1.coin() == true){
					coin_score += 1;
					f2.drawImage(Block, block1.getX_Block() - getX_Bild(), block1.getY_Block(), null);
				}
			}
			block2.Kollisionsabfrage_für_Coin(block2.getX_Block() - getX_Bild(),block2.getY_Block() + block2.getHeight(), left + (74 - 12), panda_y );{
				if(block2.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block2.getX_Block() - getX_Bild(), block2.getY_Block(), null);
				}
			}
			block3.Kollisionsabfrage_für_Coin(block3.getX_Block() - getX_Bild(),block3.getY_Block() + block3.getHeight(), left + (74 - 12), panda_y );{
				if(block3.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block3.getX_Block() - getX_Bild(), block3.getY_Block(), null);
				}
			}
			block4.Kollisionsabfrage_für_Coin(block4.getX_Block() - getX_Bild(),block4.getY_Block() + block4.getHeight(), left + (74 - 12), panda_y );{
				if(block4.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block4.getX_Block() - getX_Bild(), block4.getY_Block(), null);
				}
			}
			block5.Kollisionsabfrage_für_Coin(block5.getX_Block() - getX_Bild(),block5.getY_Block() + block5.getHeight(), left + (74 - 12), panda_y );{
				if(block5.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block5.getX_Block() - getX_Bild(), block5.getY_Block(), null);
				}	
			}
			block6.Kollisionsabfrage_für_Coin(block6.getX_Block() - getX_Bild(),block6.getY_Block() + block6.getHeight(), left + (74 - 12), panda_y );{
				if(block6.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block6.getX_Block() - getX_Bild(), block6.getY_Block(), null);
				}
			}
			block7.Kollisionsabfrage_für_Coin(block7.getX_Block() - getX_Bild(),block7.getY_Block() + block7.getHeight(), left + (74 - 12), panda_y );{
				if(block7.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block7.getX_Block() - getX_Bild(), block7.getY_Block(), null);
				}
			}
			block8.Kollisionsabfrage_für_Coin(block8.getX_Block() - getX_Bild(),block8.getY_Block() + block8.getHeight(), left + (74 - 12), panda_y );{
				if(block8.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block8.getX_Block() - getX_Bild(), block8.getY_Block(), null);
				}
			}
			block9.Kollisionsabfrage_für_Coin(block9.getX_Block() - getX_Bild(),block9.getY_Block() + block9.getHeight(), left + (74 - 12), panda_y );{
				if(block9.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block9.getX_Block() - getX_Bild(), block9.getY_Block(), null);
				}	
			}
			block10.Kollisionsabfrage_für_Coin(block10.getX_Block() - getX_Bild(),block10.getY_Block() + block10.getHeight(), left + (74 - 12), panda_y );{
				if(block10.coin() == true){
				coin_score += 1;
				f2.drawImage(Block, block10.getX_Block() - getX_Bild(), block10.getY_Block(), null);
}
			}
			Taler1.Kollisionsabfrage_für_Taler(Taler1.getX_Taler() - getX_Bild(),Taler1.getY_Taler() + Taler1.getHeight(), left + (74 - 12), panda_y );{
				if(Taler1.coin() == true){
				coin_score += 10;				
				Taler = null;
				}
			}
			Taler2.Kollisionsabfrage_für_Taler(Taler2.getX_Taler() - getX_Bild(),Taler2.getY_Taler() + Taler2.getHeight(), left + (74 - 12), panda_y );{
				if(Taler2.coin() == true){
				coin_score += 10;
				Taler = null;
				}
			}
			Taler3.Kollisionsabfrage_für_Taler(Taler3.getX_Taler() - getX_Bild(),Taler3.getY_Taler() + Taler3.getHeight(), left + (74 - 12), panda_y );{
				if(Taler3.coin() == true){
				coin_score += 10;
				Taler = null;
				}
			}
			
			//Der 'Score' wird oben links in der Ecke gezeichnet.
			f2.drawString("Score: " + coin_score, 10, 15);
		}

		private int getX_Bild(){
			return X_Bild;	
		}
			
		//Die Lauffunktion wird definiert.
		public void bewegen(){
			//Wenn nicht nach links gelaufen wird. Also nach rechts gelaufen oder stehen geblieben wird.
			if(lauf != -5){
				//Solange die X-Koordinate des Charakters plus die Laufgeschwindigkeit kleiner als 100 ist:
				if(left + lauf <= 250){
					//Bewegt sich der Charakter nach rechts
					left += lauf;
				}
				//Wenn 75 erreicht wurde:
				else {
					//Bewegt sich das Bild und der Charakter 'steht'.
					X_Bild += lauf;
					nx += lauf;
					nx2 += lauf;
				}
			}
			//Wenn die X_Koordinate des Charakters plus die Laufgeschwindigkeit größer als 0 ist:
			else {
				if(left + lauf > 200){
					//Bewegt sich der Charakter nach vorne
					left += lauf;
				}
				else{
					//Bewegt sich das Bild und der Charakter 'steht'.
					X_Bild += lauf;
					nx += lauf;
					nx2 += lauf;	
				}
			}
		}
		
	private class AL extends KeyAdapter{
		public AL(){	
		}

		public void keyPressed(KeyEvent e){
			key = e.getKeyCode();
			//Beim Druck der linken Taste, scrollt der Hintergrund nach rechts.
			if(key == KeyEvent.VK_LEFT){
			lauf = -5;
			}
			//Beim Druck der rechte Taste, scrollt der Hintergrund nach links.
			if(key == (KeyEvent.VK_RIGHT)){
			lauf = 5;
			}
			//Beim Druck der Leertaste, springt der Charakter.
			if(key == KeyEvent.VK_SPACE){
				Sprung();
			}
		}
		
		//Werden die Tasten losgelassen, soll der Hintergrund stillstehen.
		public void keyReleased(KeyEvent e){
			key = e.getKeyCode();
			if(key == KeyEvent.VK_LEFT || key == KeyEvent.VK_RIGHT){
				lauf = 0;
			}
		}		
	}
	
	//Der Sprung wird ausgeführt.
	public void Sprung(){
		Sprung SprungAnimation = new Sprung();
		SprungAnimation.start();
	}
}
```


----------

