lundi 4 mai 2015

BouncingBalls 1 Thread

Guten Tag.
Ich habe das Bouncing Balls Programm geschrieben und es funktioniert auch. Die Bälle stoßen sich an den Wänden ab. (Gegeneinander noch nicht, aber das tut nichts zur sache)

Mein Programm sieht folgender maßen aus:

Java Code:

  1.  
  2. public class BouncingBalls {
  3.  
  4. public static void main(String args[]) {
  5. BallFrame bb = new BallFrame();
  6. }
  7. }


BallFrame
Java Code:

  1.  
  2. public class BallFrame extends JFrame{
  3. private ShapePanel drawPanel;
  4. private BallList ballList;
  5.  
  6.  
  7. public BallFrame() {
  8. setTitle("Bouncing Balls");
  9. setSize(400, 400);
  10. setLayout(new BorderLayout());
  11. ballList=new BallList();
  12. drawPanel=new ShapePanel(ballList, this);
  13. //Liste mit den Bällen
  14. add(drawPanel, BorderLayout.CENTER);
  15. setVisible(true);
  16.  
  17. //mit 'X' beenden
  18. addWindowListener(new WindowAdapter() {
  19. public void windowClosing(WindowEvent e) {
  20. System.exit(0);
  21. }
  22. }
  23. );
  24.  
  25. //verschiedene Tasten und deren Funktionen
  26. addKeyListener(new KeyAdapter() {
  27.  
  28. public void keyReleased(KeyEvent e){
  29. switch(e.getKeyChar()){
  30. case '+': //Bälle hinzufügen
  31. ballList.addBall(drawPanel);
  32. break;
  33.  
  34. case '-': //Bälle entfernen
  35. ballList.removeBall();
  36. break;
  37.  
  38. case 'g': //Bälle größer machen
  39. ballList.setSize(ballList.getSize()+5);
  40. for (Ball b:ballList.getBalls()){
  41. b.bigger();
  42. }
  43.  
  44. break;
  45.  
  46. case 'k': //Bälle kleiner machen
  47. ballList.setSize(ballList.getSize()-5);
  48. for(Ball b:ballList.getBalls()){
  49. b.smaller();
  50. }
  51. break;
  52.  
  53. case 's': //Bälle schneller machen
  54. ballList.setSpeed(ballList.getSpeed()-5);
  55. for(Ball b:ballList.getBalls()){
  56. b.faster();
  57.  
  58. }
  59. break;
  60.  
  61. case 'l': //Bälle langsamer machen
  62. ballList.setSpeed(ballList.getSpeed()+5);
  63. for(Ball b:ballList.getBalls()){
  64. b.slower();
  65. }
  66. break;
  67. }
  68. }
  69. }
  70. );
  71.  
  72. }
  73.  
  74. //Getter und Setter Methoden
  75. public ShapePanel getDrawPanel() {
  76. return drawPanel;
  77. }
  78.  
  79. public void setDrawPanel(ShapePanel drawPanel) {
  80. this.drawPanel = drawPanel;
  81. }
  82.  
  83. public BallList getBallList() {
  84. return ballList;
  85. }
  86.  
  87. public void setBallList(BallList ballList) {
  88. this.ballList = ballList;
  89. }
  90.  
  91. }


BallList
Java Code:

  1.  
  2. public class BallList extends Thread{
  3. private ArrayList<Ball> balls;
  4. private int speed=50;
  5. private int size=50;
  6.  
  7. public BallList() {
  8. balls=new ArrayList();
  9. }
  10.  
  11.  
  12. public synchronized void addBall(ShapePanel drawPanel){
  13. Ball newBall = new Ball(drawPanel, size, speed);
  14. balls.add(newBall);
  15. newBall.start();
  16. }
  17.  
  18. public synchronized void removeBall(){
  19. balls.remove(balls.get(balls.size()-1));
  20. }
  21.  
  22. public ArrayList<Ball> getBalls() {
  23. return balls;
  24. }
  25.  
  26. public void setBalls(ArrayList<Ball> balls) {
  27. this.balls = balls;
  28. }
  29.  
  30. public int getBallListSize(){
  31. return this.balls.size();
  32. }
  33.  
  34. public int getSpeed() {
  35. return speed;
  36. }
  37.  
  38. public void setSpeed(int speed) {
  39. this.speed = speed;
  40. }
  41.  
  42. public int getSize() {
  43. return size;
  44. }
  45.  
  46. public void setSize(int size) {
  47. this.size = size;
  48. }
  49.  
  50.  
  51. }


Ball
Java Code:

  1.  
  2. public class Ball extends Thread{
  3. private ShapePanel drawPanel;
  4. private Ellipse2D.Double thisBall;
  5. private boolean ballStarted;
  6. private int size, speed, deltax, deltay;
  7.  
  8.  
  9. public Ball(ShapePanel dP, int sz, int sp) {
  10. drawPanel=dP;
  11. ballStarted=true; //benötigt für Dauerschleife
  12. size=sz;
  13. speed=sp; //benötigt für sleep von Thread
  14. deltax=10; //Speed X Achse
  15. deltay=10; //Speed Y Achse
  16. int startx=(int)(Math.random()*300); //Start Position X&Y
  17. int starty=(int)(Math.random()*300);
  18. thisBall=new Ellipse2D.Double(startx, starty, size, size); //ertselle einen Ball
  19. }
  20.  
  21. public void draw(Graphics2D g2d){ //Ball zeichenen
  22. if(thisBall!=null){
  23. g2d.setColor(Color.red);
  24. g2d.fill(thisBall);
  25. }
  26.  
  27. }
  28.  
  29. public void run(){
  30. while(ballStarted){ //Endlosschleife
  31. try{
  32. Thread.sleep(speed); //verlangsamen
  33.  
  34. }
  35.  
  36. int newx=(int)thisBall.getX()+deltax;
  37. int newy=(int)thisBall.getY()+deltay;
  38.  
  39. if(newx+size>drawPanel.getWidth()||newx<0){ //Links oder rechts angestößen?
  40. deltax= -deltax; //dann andere Richtung
  41. }
  42.  
  43. if(newy+size>drawPanel.getHeight()||newy<0){ //Oben oder Unten angsetoßen?
  44. deltay= -deltay; //Dann andere Richtung
  45. }
  46.  
  47. thisBall.setFrame(newx, newy, size, size);
  48. drawPanel.repaint();
  49. }
  50. }
  51.  
  52. public synchronized void bigger(){
  53. this.setSize(this.getSize()+5);
  54.  
  55. }
  56.  
  57. public synchronized void smaller(){
  58. this.setSize(this.getSize()-5);
  59. }
  60.  
  61. public synchronized void slower(){
  62. this.setSpeed(this.getSpeed()+5);
  63. }
  64.  
  65. public synchronized void faster(){
  66. this.setSpeed(this.getSpeed()-5);
  67. }
  68.  
  69. Getter und Setter Methoden
  70. ...


ShapePanel
Java Code:

  1.  
  2. public class ShapePanel extends JPanel{
  3. private int wid, ht;
  4. private BallList bb;
  5.  
  6. public ShapePanel(BallList b2, BallFrame f) {
  7. this.wid = f.getWidth();
  8. this.ht = f.getHeight();
  9. bb=b2;
  10. }
  11.  
  12. public void paintComponent(Graphics g){ //Bälle im JPanel zeichnen
  13. super.paintComponent(g);
  14.  
  15. for(int i=0; i<bb.getBalls().size(); i++){
  16. bb.getBalls().get(i).draw(g2d);
  17. }
  18. }
  19.  
  20. //Getter und Setter Methoden



Das Problem ist, wenn ich einen neuen Ball hinzufüge, erstelle ich einen neuen Thread, was ja Kontraproduktiv ist. Wie programmiere ich es am besten um, dass ich nur 1 Thread erzeuge?


BouncingBalls 1 Thread

0 commentaires:

Enregistrer un commentaire