Langweilige Ballbewegung

Lucaaa

Bekanntes Mitglied
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:
Java:
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

Top Contributor
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

Bekanntes Mitglied
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?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Ballbewegung Spiele- und Multimedia-Programmierung 9

Ähnliche Java Themen

Neue Themen


Oben