# BrickBreaker Spiel



## Lucaaa (9. Jan 2018)

Hallo ich wollte ein kleines BrickBreaker Spiel programmieren. (sowas wie DX-Ball falls das wer kennt nur halt sehr vereinfacht). Ich bin soweit, dass ich einen Ball habe, der sich bewegt und auch die Bricks. Mein problem ist nur...
...das der Ball durch die Bricks durchfliegt.
... die X-Richtungsveränderung des Balls sich einscheinend auf 0 setzt denn der Ball bewegt sich dann nur nach senkrecht hoch und runter.
... die Bricks nicht verschwinden.

Außerdem noch folgende Fragen dazu:
Wie kann ich neue Level dann hinzufügen?
Wie kriege ich es hin, dass wenn ich den Ball mit der rechten Seite des ich nenne es mal schlägers treffe nach rechts fliegt, und mit der linken eben nach Links?

Vielen Dank für eure Hilfe.

Die Main Klasse:



```
package com.ludevstudio.brickbreaker;
import javax.swing.JFrame;
public class Main extends JFrame{
 GamePlay PlayGround = new GamePlay();
 
 public static void main(String[] args) {
  new Main();
  
 }
 
 
 public Main() {
  setSize(800, 800);
  setDefaultCloseOperation(EXIT_ON_CLOSE);
  setResizable(false);
  setLocationRelativeTo(null);
  add(PlayGround.getPanel());
  setVisible(true);
 }
 
 
}
```

Die GamePlay Klasse

```
package com.ludevstudio.brickbreaker;
import java.awt.Color;import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
import java.util.Timer;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.w3c.dom.css.Rect;
public class GamePlay extends JPanel implements KeyListener, ActionListener{
 private static final long serialVersionUID = 1L;
 Boolean play = false;
 private int score = 0;
 private int totalBricks = 21;
 
 private javax.swing.Timer timer;
 private int delay = 8;
 
 private int playerX = 350;
 private int ballPosX = 390;
 private int ballPosY = 710;
 private int ballXdir = -3;
 private int ballYdir = -2;
 
 private MapGenerator mapGenerator;
 
 public GamePlay() {
  mapGenerator = new MapGenerator(4, 8);
  
  setVisible(true);
  setLayout(null);
  setFocusable(true);
  addKeyListener(this);
  
  timer = new javax.swing.Timer(delay, this);
  timer.start();
  
  
  
  
 }
 
 public JPanel getPanel() {
  return this;
 }
 
 public void paint (Graphics g) {
  // Background
  g.setColor(Color.BLACK);
  g.fillRect(0, 0, this.getWidth(), this.getHeight());
  
  // Map
  mapGenerator.draw((Graphics2D)g);
  
  // Border
  g.setColor(Color.BLUE);
  g.fillRect(0, 0, this.getWidth(), 10);
  g.fillRect(0, 0, 10, this.getHeight());
  g.fillRect(this.getWidth()-10, 0, 10, this.getHeight());
  
  //Ball
  g.setColor(Color.YELLOW);
  g.fillOval(ballPosX, ballPosY, 20, 20);
  
  // Paddle
  g.setColor(Color.GREEN);
  g.fillRect(playerX, 730, 100, 10);
  
  g.dispose();
 }

 @Override
 public void actionPerformed(ActionEvent arg0) {
  timer.start();
  
  if(play) {
   ballPosX += ballXdir;
   ballPosY += ballYdir;
    
   if(new Rectangle(ballPosX, ballPosY, 20, 20).intersects(new Rectangle(playerX, 730, 100, 10))) {
    ballYdir = - ballYdir;
   }
   
   
  A: for (int i=0; i<mapGenerator.map.length; i++) {
    for(int j = 0; j<mapGenerator.map[0].length; j++) {
     if(mapGenerator.map[i][j] > 0) {
      int brickX = i*mapGenerator.brickWidth+50;
      int brickY = j*mapGenerator.brickHeight+60;
      int brickWidth = mapGenerator.brickWidth;
      int brickHeight = mapGenerator.brickHeight;
      
      Rectangle rect = new Rectangle(brickX, brickY, brickWidth, brickHeight);
      Rectangle ballRect = new Rectangle(ballPosX, ballPosY, 20, 20);
      Rectangle brickRect = rect;
      
      if(ballRect.intersects(brickRect)) {
       mapGenerator.setBrickValue(0, i, j);
       totalBricks--;
       score += 10;
      }
     
      if(ballPosX+19 >= brickRect.x || ballPosX+1 <= brickRect.x+brickRect.width ) {
       ballXdir = -ballXdir;
      } else {
       ballYdir = -ballYdir;
      }
      break A;
     }
     
    }
   }
   
   
   
   
   if(ballPosX<0) {
     ballXdir = - ballXdir;
    }
    if(ballPosY<0) {
     ballYdir = - ballYdir;
    }
    if(ballPosX>this.getWidth()) {
     ballXdir = - ballXdir;
    }
  }
  
  
  
  
  repaint();
 }

 @Override
 public void keyPressed(KeyEvent e) {  
  if(e.getKeyCode() == KeyEvent.VK_LEFT) {
    moveLeft();
  } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
   moveRight();
  
  }
 }

 @Override
 public void keyReleased(KeyEvent arg0) {
  // TODO Auto-generated method stub
  
 }

 @Override
 public void keyTyped(KeyEvent arg0) {
  // TODO Auto-generated method stub
  
 }
 
 public void moveRight() {
  if(playerX>this.getWidth()-30-100) {
   playerX = this.getWidth()-30-100;
   } else {
    playerX += 40; 
    play = true;
   }
 }
 
 public void moveLeft() {
  if(playerX<30) {
   playerX = 30;
   } else {
    playerX -= 40;
    play = true;
   }
 }
 
 
 
 
 
}
```

Die MapGenerator Klasse


```
package com.ludevstudio.brickbreaker;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.Stroke;
import java.util.Random;
public class MapGenerator {
 
 public int map[][];
 public int brickWidth;
 public int brickHeight;
 int color;
 
 public MapGenerator(int row, int col) {
  map = new int[row][col];
   
  for(int i = 0; i<map.length; i++) {
   for(int j = 0; j<map[0].length; j++) {
    map[i][j] = 1;
   }
   
    Random random = new Random();
    color = random.nextInt(9);
   }
   
   brickWidth = 700/col;
   brickHeight = 300/row;
   
  }
 
 public void setBrickValue(int value, int i, int j) {
  map[i][j] = value;
 }
 public void draw(Graphics2D g) {
  for(int i = 0; i<map.length; i++) {
   for(int j = 0; j<map[0].length; j++) {
    if(map[i][j]>0) {
      
      
      
       
       if(color==0) {
       g.setColor(Color.WHITE);
      } else if(color==1) {
       g.setColor(Color.YELLOW);
      }  else if(color==2) {
       g.setColor(Color.ORANGE);
      }  else if(color==3) {
       g.setColor(Color.RED);
      }  else if(color==4) {
       g.setColor(Color.BLUE);
      }  else if(color==5) {
       g.setColor(Color.GREEN);
      }  else if(color==6) {
       g.setColor(Color.GRAY);
      }  else if(color==7) {
       g.setColor(Color.PINK);
      }  else if(color==8) {
       g.setColor(Color.MAGENTA);
      } else if(color==9) {
       g.setColor(Color.cyan);
      } 
       g.fillRect(j*brickWidth+50, i*brickHeight+60, brickWidth, brickHeight);
       
     g.setStroke(new BasicStroke(3));
      g.setColor(Color.black);
     g.drawRect(j*brickWidth+50, i*brickHeight+60, brickWidth, brickHeight);
    
   
   
     }
   }
 }
 
 
 
}
}
[Code]
```


----------



## Blender3D (10. Jan 2018)

Lucaaa hat gesagt.:


> Außerdem noch folgende Fragen dazu:
> Wie kann ich neue Level dann hinzufügen?
> Wie kriege ich es hin, dass wenn ich den Ball mit der rechten Seite des ich nenne es mal schlägers treffe nach rechts fliegt, und mit der linken eben nach Links?


Dein Problem ist, dass Du das Pferd von hinten aufzäumst. Das Codedesign von Dir wird Dich mehr, hindern als Dich vorwärtszubringen. 
Mein Tipp: "Teile und Herrsche ", das bedeutet: Wenn Du ein großes Problem lösen willst, zerlege es zuerst in seine Teilprobleme. Die sind leichter zu lösen und helfen Dir dann bei dem Hauptproblem.
Das zentrale Objekt in dem Spiel ist der Ball. Der soll bewegt werden. Vergiss vorerst das ganze Spiel und baue dir eine Klasse Ball. Der Ball soll sich in einem beliebigen Winkel und mit variabler  Geschwindigkeit bewegen können.
Wenn Du das geschafft hast kannst Du den nächsten Schritt machen.


----------



## Blender3D (10. Jan 2018)

Lucaaa hat gesagt.:


> Außerdem noch folgende Fragen dazu:
> Wie kann ich neue Level dann hinzufügen?
> Wie kriege ich es hin, dass wenn ich den Ball mit der rechten Seite des ich nenne es mal schlägers treffe nach rechts fliegt, und mit der linken eben nach Links?


Dein Problem ist, dass Du das Pferd von hinten aufzäumst. Das Codedesign von Dir wird Dich mehr, hindern als Dich vorwärtszubringen. 
Mein Tipp: "Teile und Herrsche ", das bedeutet: Wenn Du ein großes Problem lösen willst, zerlege es zuerst in seine Teilprobleme. Die sind leichter zu lösen und helfen Dir dann bei dem Hauptproblem.
Das zentrale Objekt in dem Spiel ist der Ball. Der soll bewegt werden. Vergiss vorerst das ganze Spiel und baue dir eine Klasse Ball. Der Ball soll sich in einem beliebigen Winkel und mit variabler  Geschwindigkeit bewegen können.
Wenn Du das geschafft hast kannst Du den nächsten Schritt machen.


----------



## Lucaaa (10. Jan 2018)

Blender3D hat gesagt.:


> Dein Problem ist, dass Du das Pferd von hinten aufzäumst. Das Codedesign von Dir wird Dich mehr, hindern als Dich vorwärtszubringen.
> Mein Tipp: "Teile und Herrsche ", das bedeutet: Wenn Du ein großes Problem lösen willst, zerlege es zuerst in seine Teilprobleme. Die sind leichter zu lösen und helfen Dir dann bei dem Hauptproblem.
> Das zentrale Objekt in dem Spiel ist der Ball. Der soll bewegt werden. Vergiss vorerst das ganze Spiel und baue dir eine Klasse Ball. Der Ball soll sich in einem beliebigen Winkel und mit variabler Geschwindigkeit bewegen können.
> Wenn Du das geschafft hast kannst Du den nächsten Schritt machen.


Ich habe die Lösung für den Ballstillstand entdeckt. Vielen Dank für deinen Denkanstoß


----------

