博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java 碰撞的球 MovingBall (整理)
阅读量:6259 次
发布时间:2019-06-22

本文共 4824 字,大约阅读时间需要 16 分钟。

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 }

效果如图:

转载地址:http://idasa.baihongyu.com/

你可能感兴趣的文章
EF架构~为EF DbContext生成的实体添加注释(T5模板应用)
查看>>
【转】VLAN原理详解
查看>>
python --- json模块和pickle模块详解
查看>>
idea中artifacts、facets、modules是什么意思?
查看>>
FUCKED-BUG之临时对象的生死
查看>>
SP2 PRIME1 - Prime Generator
查看>>
创建和编辑 crontab 文件
查看>>
钉钉发消息
查看>>
20172309_《程序设计与数据结构(下)》_课堂测试修改报告。
查看>>
(二十九)方法调用之解析
查看>>
Springboot文件上传与下载
查看>>
Activity与Fragment数据传递之Fragment从Activity获取数据 分类: ...
查看>>
记一次小的51CTO聚会
查看>>
架構設計_案例說明_by 高老師
查看>>
VR內容開發(PAGE-2)
查看>>
飞舞的蝴蝶
查看>>
Linux环境下C语言模拟内存负载测试
查看>>
专栏《轻松玩转ELK海量可视化日志分析系统》已完结【附代码下载】
查看>>
新手IT人员,如何找到适合自己专业书籍的6个问题?
查看>>
初学者学习linux运维的几个问题及老鸟建议
查看>>