且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

Java 碰撞的球 MovingBall (整理)

更新时间:2022-08-12 20:58:49

  1 package demo;
  2 
  3 /**
  4  *                     Java 碰撞的球 MovingBall (整理)
  5  * 声明:
  6  *     这份源代码没有注释,已经忘记了为什么要写他了,基本上应该是因为当时觉得好玩吧。
  7  * 有时候想想,也许是因为当时就是想做一个这样的效果的东西。
  8  *
  9  *                                   2016-1-2 深圳 南山平山村 曾剑锋
 10  */
 11 
 12 import java.awt.Color;
 13 import java.awt.Graphics;
 14 
 15 import javax.swing.JFrame;
 16 import javax.swing.JPanel;
 17 
 18 public class MovingBall extends JPanel {
 19 
 20     private static final long serialVersionUID = 1L;
 21     static int centerX = 600/2;
 22     static int centerY = 600/2;
 23     final Ball ball = new Ball(centerX, centerY);
 24     boolean cicleflag = true;
 25     int cicleSemi = 0;
 26     double angle = 0;
 27     int ballCicle = 30;
 28     public MovingBall() {
 29         start();
 30     }
 31     @Override
 32     public void paint(Graphics graphics) {
 33         super.paint(graphics);
 34         this.setBackground(Color.black);
 35         graphics.setColor(Color.BLUE);
 36         graphics.fillArc(centerX-cicleSemi/2, centerY-cicleSemi/2, cicleSemi, cicleSemi, 0, 360);
 37         ball.drawing(graphics);
 38         graphics.setColor(Color.white);
 39         graphics.drawArc(centerX-cicleSemi/2, centerY-cicleSemi/2, cicleSemi, cicleSemi, 0, 360);
 40         graphics.fillArc((int)(centerX+cicleSemi/2*Math.cos(angle*Math.PI/180)-ballCicle/2), (int)(centerY+cicleSemi/2*Math.sin(angle*Math.PI/180)-ballCicle/2), ballCicle, ballCicle, 0, 360);
 41         graphics.fillArc((int)(centerX+cicleSemi/2*Math.cos((angle+180)*Math.PI/180)-ballCicle/2), (int)(centerY+cicleSemi/2*Math.sin((angle+180)*Math.PI/180)-ballCicle/2), ballCicle, ballCicle, 0, 360);
 42     }
 43     public void start() {
 44         new Thread(new Runnable() {
 45             
 46             @Override
 47             public void run() {
 48                 while (true) {
 49                     try {
 50                         ballMove(ball);
 51                         
 52                         if (cicleflag == true) {
 53                             cicleSemi += 2;
 54                             if (cicleSemi > centerX) {
 55                                 cicleflag = false;
 56                             }
 57                         }else {
 58                             cicleSemi -= 2;
 59                             if (cicleSemi < 0) {
 60                                 cicleflag = true;
 61                             }
 62                         }
 63                         angle ++;
 64                         repaint();
 65                         Thread.sleep(20);
 66                     } catch (InterruptedException e) {
 67                         e.printStackTrace();
 68                     }
 69                 }
 70                 
 71             }
 72 
 73             public void ballMove(Ball ball) {
 74                 ball.x += ball.dx;
 75                 ball.y += ball.dy;
 76                 if (ball.x < 50 || ball.x > centerX*2-50) {
 77                     ball.dx = -ball.dx;
 78                 }else if (ball.y < 50 || ball.y > centerY*2-50) {
 79                     ball.dy = -ball.dy;
 80                 }
 81             }
 82         }).start();
 83     } 
 84     
 85     public static void main(String[] args) {
 86         JFrame jFrame = new JFrame();
 87         jFrame.setTitle("MovingBall");
 88         jFrame.setSize(centerX*2, centerY*2);
 89         jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 90         jFrame.setLocationRelativeTo(null);
 91         
 92         MovingBall moveBall = new MovingBall();
 93         jFrame.add(moveBall);
 94         jFrame.setVisible(true);
 95     }
 96 }
 97 
 98 class Ball{
 99     static int step = 10;
100     int x;
101     int y;
102     int dx;
103     int dy;
104     double angle;
105     int cicle = 30;
106     public Ball(int x, int y) {
107         this.x = x;
108         this.y = y;
109         this.angle = Math.random()*360;
110         if (angle <= 180) {
111             dx = (int) (step*Math.cos(angle*Math.PI/180));
112             dy = (int) (step*Math.sin(angle*Math.PI/180));
113         }else {
114             dx = (int) (step*Math.cos(angle*Math.PI/180));
115             dy = -(int) (step*Math.sin(angle*Math.PI/180));
116         }
117     }
118     public Ball(int x, int y, int angle) {
119         this.x = x;
120         this.y = y;
121         this.angle = angle;
122         if (angle <= 180) {
123             dx = (int) (step*Math.cos(angle*Math.PI/180));
124             dy = (int) (step*Math.sin(angle*Math.PI/180));
125         }else {
126             dx = (int) (step*Math.cos(angle*Math.PI/180));
127             dy = -(int) (step*Math.sin(angle*Math.PI/180));
128         };
129     }
130     public void drawing(Graphics graphics) {
131         graphics.setColor(Color.white);
132         graphics.fillArc(this.x-cicle/2, this.y-cicle/2, cicle, cicle, 0, 360);
133     }
134 }

效果如图:

Java 碰撞的球 MovingBall (整理)

Java 碰撞的球 MovingBall (整理)

Java 碰撞的球 MovingBall (整理)