因为是图形化界面的游戏,所以先创建一个窗口,并设置窗口可见

Jframe frame=new Jframe();//创建一个窗口
frame.setVisible(true);

设置窗口的大小

frame.setSize(canvaseWidth,canvaseHeight);

设置窗口关闭

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

设置宽高不可改变

setResizable(false);

设置窗口的标题

frame.setTitle("自由的泡泡");

开一个子线程运行UI避免在主线程中做耗时性的操作

EventQueue.invokeLater(()->){Jframe frame=new Jframe();//创建一个窗口frame.setVisible(true);frame.setSize(canvaseWidth,canvaseHeight);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);frame.setTitle("泡泡机");
}

创建一个自定义类AlgoFrame(画布类),继承JFrame,基于JFrame将功能进行扩充
把主函数中的代码移到AlgoFrame里面

public AlgoFrame(String title,int canvaseWidth,int canvaseHeight) {super(title);frame.setVisible(true);frame.setSize(canvaseWidth,canvaseHeight);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);
}

主函数中的子线程为

EventQueue.invokeLater(()->){AlgoFrame frame=new AlgoFrame("泡泡机",800,800);//设置标题和宽高
}

设置成员属性,并添加修改器

public int getCanvaseWidth() {return this.canvaseWidth;//返回宽}public int getCanvaseHeight() {return this.canvaseHeight;//返回高}

添加画布类,并且创建一个无参构造函数

private class AlgoCanvas extends JPanel{public AlgoCanvas(){super(true);//调用父类去实现双缓存}}

在AlgoFrame中

AlgoCanvas canvas=new AlgoCanvas(); //创建自定义画布
setContentPane(canvas);//将画布放入到画板Frame里面

此时canvas画布还没有大小

public Dimension getPreferredSize() {//系统接收构造函数传入的数据自动设置好大小return new Dimension(canvaseWidth,canvaseHeight);//返回尺寸对象}

设置好画布的宽高,让画板的宽高根据画布的大小进行自适应

pack();

创建一个函数进行绘制

public void paintComponent(Graphics g) {super.paintComponent(g);//设置一个2D的笔,作用画圆Graphics2D g2d=(Graphics2D) g;//抗锯齿,提升画面质量RenderingHints hints  = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);g2d.addRenderingHints(hints);//画圆,具体的绘制流程 AlgoVisHelper.setColor(g2d, Color.RED);//设置球的颜色AlgoVisHelper.setStrokeWidth(g2d, 5);//设置球的厚度}

将画图形的功能封装到一个AlgoVisHelper的工具类里面

public class AlgoVisHelper {//私有化构造函数,让外界不可通过new 创建对象private AlgoVisHelper(){}//设置笔宽   public static void setStrokeWidth(Graphics2D g2d,int w){//端点圆,折角圆g2d.setStroke(new BasicStroke(w,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));}//设置笔颜色public static void setColor(Graphics2D g2d,Color color){g2d.setColor(color);}//画空心圆public static void strokeCircle(Graphics2D g2d,int x,int y,int r){Ellipse2D circle=new Ellipse2D.Double(x-r,y-r,2*r,2*r);g2d.draw(circle);}//画实心圆public static void fillCircle(Graphics2D g2d,int x,int y,int r){//x,y是圆心的坐标,r是半径Ellipse2D circle=new Ellipse2D.Double(x-r,y-r,2*r,2*r);g2d.fill(circle);}//设置球暂停public static void pause(int t){try{Thread.sleep(t);}catch (InterruptedException e){e.printStackTrace();}}   } 

创建一个圆的类Circle(要实现圆的一些属性)

public class Circle {public int x , y;//圆的圆心public int r;//圆的半径public int vx , vy;//圆的横向和竖向速度public Boolean isFill=false;public Circle(int x,int y,int r,int vx,int vy){this.x=x;this.y=y;this.r=r;this.vx=vx;this.vy=vy;}public int getR(){return r;}//移动圆public void move(int minx,int miny,int maxx,int maxy){x+=vx;  //当前坐标加速度y+=vy;checkCollision(minx,miny,maxx,maxy);}//边界碰撞检测private void checkCollision(int minx,int miny,int maxx,int maxy){if(x-r<minx){x=r;vx=-vx;}if(x+r>=maxx){x=maxx-r;vx=-vx;}if(y-r<miny){y=r;vy=-vy;}if(y+r>=maxy){y=maxy-r;vy=-vy;}}//判断圆中是否包含这个点public boolean contains(Point p){return (x-p.x)*(x-p.x)+(y-p.y)*(y-p.y)<=r*r;}}

主函数中创建圆的数据

int canvasWidth=1000;
int canvasWidth=1000;
int N=10;
int R=10;
Circle[] circle=new Circle[10];
for(int i=0;i<circles.length;i++){int x=;int y=;int r=;}设置随机生成圆的范围
在AlgoFrame中创建一个render类进行接受数据
private Circle[] circles;public void render(Circle[] circles) {this.circles = circles;repaint();//重绘数据}绘制圆for (Circle circle:circles) {if(circle.isFill){  //如果圆实心则填充AlgoVisHelper.fillCircle(g2d,circle.x,circle.y,circle.getR());}else{   //如果圆空心则画圆AlgoVisHelper.strokeCircle(g2d,circle.x,circle.y,circle.getR());}}创建AlgoVisualizer类(将控制信息交给它,进行初始化数据、初始化界面、更新数据实现动画逻辑)
public class AlgoVisualizer {//更新数据(动画逻辑)private int canvaseWidth;private int canvaseHeight;private Circle[] circles;private AlgoFrame frame;public AlgoVisualizer(int canvaseWidth,int canvaseHeight,int N) {//this.canvaseWidth=canvaseWidth;//this.canvaseHeight=canvaseHeight;int R = 50;//初始化数据circles = new Circle[N];for (int i = 0; i < N; i++) {int x =(int) (Math.random() * (canvaseWidth - 2 * R) + R);int y =(int) (Math.random() * (canvaseHeight - 2 * R) + R);int vx =(int)(Math.random() * 21 - 10);int vy =(int)(Math.random() * 21 - 10);circles[i] = new Circle(x, y, R, vx, vy);}

 //初始化界面//创建一个子线程运行UI,避免在主线程中做耗时性的操作EventQueue.invokeLater(()->{//创建一个窗口frame=new AlgoFrame("泡泡机",canvaseWidth,canvaseHeight); //调用AlgoFrame构造函数//给画布添加键盘监听事件frame.addKeyListener(new AlgoKeyListener());//给画布添加鼠标监听事件frame.addMouseListener(new AlgoMouseListener());;//开启新的线程,让数据改变(每一个圆移动、)new Thread(()->{//更新数据(动画逻辑)run();}).start();});}//将动画封装成一个类public void run() {while (true) {frame.render(circles);//将数据传值给Frame,让Frame进行绘制//让每一个圆进行一次移动,是否动画if(!isPause) {for (Circle circle : circles) {circle.move(0 , 0 ,frame.getCanvaseHeight(), frame.getCanvaseHeight());}}//停一会AlgoVisHelper.pause(50);}}
//鼠标监听事件private  class AlgoMouseListener extends MouseAdapter{@Overridepublic void mousePressed(MouseEvent e) {//现在这个点不是画布坐标的点,需要偏移e.translatePoint(0,-(frame.getBounds().height-frame.getCanvaseHeight()-22));//规格化坐标,设置偏移量 for(Circle circle:circles){if(circle.contains(e.getPoint())){circle.isFill=!circle.isFill;}}}}private boolean isPause=false;//设置布尔控制是否动画private class AlgoKeyListener extends KeyAdapter{public void keyReleased(KeyEvent e) {    //键盘监听的方法,键盘释放后暂停if(e.getKeyChar()==' ') {  //如果是空格则暂停(停止数据更新)isPause=!isPause;}}
}
}

图形界面画游戏泡泡机相关推荐

  1. linux下的图形界面扫雷游戏(Gtk+2.0)

    linux下的图形界面扫雷游戏(Gtk+2.0) 空间 转载请注明出处.http://www.cnblogs.com/dave_cn/ 之前做了一个字符界面下的扫雷(http://www.cnblog ...

  2. C++实现图形界面五子棋游戏源码

    C++图形界面五子棋, Shell控制台实现五子棋的基础上引用了图形库源码. 如需安装c++或远程调试,可加QQ905733049由专业技术人员远程协助! 下面给出代码: #include<gr ...

  3. Ubuntu 12.04 图形界面问题解决 开机死机

    刚装的Ubuntu 12.04 64位估计有不少人遇到了这样的问题,主要是两个. 第一个是:安装过程很顺利,完成安装后启动输入完密码就黑屏了. 解决方法是,关闭VMware设置中显示器的加速3D图形选 ...

  4. linux命令界面下载kettle,kettle在linux环境中打开图形界面-Go语言中文社区

    kettle在linux环境中打开图形界面 kettle数据转换的时候需要图形界面 当运行./spoon.sh时,如果没有图形界面,会出现下面的结果 ./spoon.sh [root@localhos ...

  5. VNC Viewer建立多个图形界面,来远程访问同一个服务器(Ubuntu)

    文章目录 前言 背景 1.新建用户 2.以新用户身份建立vnc连接 3.设置VNC viewer,顺利开启 小结 参考文献 前言 创作开始时间:2021年4月2日20:42:13 如题.目前已经有了一 ...

  6. c语言循环写回合制小游戏_告别黑框框——用C语言Easyx图形库实现图形界面

    很早以前就接触到了Easyx图形库,当时感叹还有这么简单的C图形库供我们使用.后开用Easyx做过推箱子.图形界面钢琴等等简单的小游戏.今天给大家介绍一下Easyx图形库. Easyx图形库是针对C+ ...

  7. C++实现图形界面双人五子棋游戏

    C++实现图形界面双人五子棋游戏 设计思路 定义一个Chess类,用16*16的二维数组的来表示一方棋手在棋局上的落子状态. 通过控制键盘←↑→↓来选择落点,getch()函数可获得用户的键盘输入,用 ...

  8. Android Studio图形界面在真机中位置错乱现象解决

    Android Studio提供了可视化的图形界面编辑功能,用户可以直接拖拽想要的组件到屏幕中即可. 但是由于手机分辨率的不同,有时在电脑模拟器中排布正常的页面,到手机真机中就无法正常显示,或者发生页 ...

  9. 【C++ 程序】 数字推盘游戏(15-puzzle)(EasyX图形界面)

    也是比较简单的程序,基于我的博客 [C++ 程序] 数字推盘游戏(15-puzzle)的逻辑,运用我的博客 [C++ 程序] 井字棋游戏(人 VS Lv3电脑)(战绩统计版)(EasyX 图形界面)的 ...

最新文章

  1. TWRP开启时误点了系统只读(不再提示)【解决方案】
  2. android vlc eclipse,在Eclipse下导入vlc-android并编译
  3. Java开发人员最常犯的10个错误,你犯过几个?
  4. C++静态成员变量和成员函数
  5. 【word2vec】篇三:基于Negative Sampling 的 CBOW 模型和 Skip-gram 模型
  6. ubuntu 开启php mysql扩展_linux(ubuntu/centos)、windows安装php-zip扩展
  7. mysql is blocked because of many connection errors
  8. python自动化测试学习有用吗_python自动化测试学习-UnitTest/PyUnit的用法介绍
  9. 上两个月,15家面试,几个offer , 我的面试历程!
  10. 为什么我旗帜鲜明的反对前后端分离
  11. 一个简单的python小游戏
  12. Docker学习笔记 1
  13. 智能门锁走向而立之年
  14. Jmeter中大佬的大集合
  15. PowerDesigner显示Comment注释
  16. 2008年SP产业发展趋势
  17. Python 寻峰算法
  18. 定性研究的小技巧与注意事项!
  19. 厦大C语言上机1381
  20. 幼儿园手工之自制时钟_幼儿园手工之自制时钟,提高孩子良好的时间观念

热门文章

  1. OS X自带数码测色计的使用
  2. 关于CE使用的详细教程
  3. 大数据——HBase数据库操作实例
  4. cad记忆口诀_10天学会CAD制图,精通变大神,以后再不有求于人
  5. 牛客2021暑期训练1-A-Alice and Bob
  6. String类的split方法,字符串分割成数组
  7. ATLAS什么时候增加服务器,ATLAS出生点介绍 ATLAS服务器说明-游侠网
  8. java sscanf_倾情奉献——JAVA sscanf函数!!!
  9. 伟福计算机组成原理实验仪,伟福cop2000型计算机组成原理实验仪.doc
  10. 根据淘宝商品ID免费获取商品详细信息(实时价格、尺码、库存等) 超详细