# Langweilige Ballbewegung



## Lucaaa (11. Jan 2018)

Guten Abend!

Ich habe hier ein BrickBreaker Spiel. Mein Problem ist, das der Ball (fast) immer zur gleichen Stelle zurückkehrt, und man so eigentlich nicht spielen braucht da der Balll ja alles allein macht. Meine Frage nun: Wie kriege ich mehr Abwechslung in die Ballbewegung?

Vielen Dank schonmal!

Hier der Code:

```
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.Random;
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 = -3;
 
 private MapGenerator mapGenerator;
 
 public GamePlay() {
  mapGenerator = new MapGenerator(15, 10);
  
  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;
   
   }
   if(new Rectangle(ballPosX, ballPosY, 20, 20).intersects(new Rectangle(playerX, 730, 100, 10))) {
    int hit = (playerX+100)-ballPosX+10;
     if(hit<20) {
      ballXdir = 4;
     } else if(hit<40) {
      ballXdir = 2;
     } else if(hit<40) {
      ballXdir = 0;
     } else if(hit<60) {
      ballXdir = -2;
     } else if(hit<80) {
      ballXdir = -4;
     }
   }
   
   }
   
   
  for (int i = 0; i<mapGenerator.map.length; i++) {
    for (int j = 0; j<mapGenerator.map[0].length; j++) {
    Rectangle brickRect = new Rectangle(j*mapGenerator.brickWidth+60, i*mapGenerator.brickHeight+60, mapGenerator.brickWidth, mapGenerator.brickHeight);
    Rectangle ballRect = new Rectangle(ballPosX-2, ballPosY-2, 22, 22);
     if(ballRect.intersects(brickRect)) {
      if(mapGenerator.map[i][j]!=0) {
       ballXdir = -ballXdir;
       ballYdir = -ballYdir;
       }
      
      
      mapGenerator.map[i][j] = 0;
      
     }
   }
  }
  
  
   
   
   if(ballPosX<10) {
     ballXdir = -ballXdir;
    }
    if(ballPosY<10) {
     ballYdir = -ballYdir;
    }
    if(ballPosX>this.getWidth()-30) {
     ballXdir = - ballXdir;
    }
    
    if(ballPosY>this.getHeight()) {
     ballYdir = - ballYdir;
    }
    
    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;
   }
 }
 
 
 
 
 
}
```


----------



## Blender3D (11. Jan 2018)

Ich habe Dir eine guten Tipp gegeben. Überlege Dir zuerst die Klasse Ball und nicht das ganze Spiel.
Und wie kann ich den Ball bewegen. Tipp: Baue dir eine Klasse Vektor2D, die die Bewegung realisiert.


----------



## Lucaaa (11. Jan 2018)

Blender3D hat gesagt.:


> wie kann ich den Ball bewegen


Ich bewege den Ball, indem ich die X- und Y-Richtung ändre. Wie realisiere ich das mit der Klasse Ball am besten? Sodass er auf die anderen Elemente reagiert? Dann Wäre es ja vielleicht auch besser, eine Klasse für jedes Level, eine für den Schläger, und eine die alles zusammenführt zu machen?


----------

