成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

java實現小球碰撞功能

瀏覽:91日期:2022-08-17 15:27:54

本文實例為大家分享了java實現小球碰撞的具體代碼,供大家參考,具體內容如下

這次我們做一個小球的碰撞的游戲,規則是:按下添加按鈕,窗口的中心部分會產生一個小球(剛開始默認為黑色),四個方向隨機產生,發射小球,再次按下即產生兩個小球。當小球碰到窗體邊緣的時候會產生反彈,當兩個小球接觸時會產生碰撞,雙方交換速度,向相反方向移動。我們可以選擇相應的顏色來改變下一個發射的小球顏色。當按下清除可以清除屏幕上的小球,當按下添加則會繼續產生小球。最后我們還添加了自動產生小球的功能,按下開關,在屏幕中間會定時產生小球。接下來,我們來展示代碼部分。

public class Jframe { private Ball[] arrayball = new Ball[100]; public static void main(String[] args) { Jframe frame = new Jframe(); frame.showUI(); } public void showUI() { javax.swing.JFrame jf = new javax.swing.JFrame(); jf.setSize(1000, 1000); jf.getContentPane().setBackground(Color.WHITE); jf.setTitle('小球'); jf.setDefaultCloseOperation(3); // 設置居中顯示 jf.setLocationRelativeTo(null); JPanel jp1 =new JPanel(); JButton jb1 = new JButton('添加'); jp1.add(jb1); // jb1.setBounds(100,50, 40, 20); JButton jb2 = new JButton('暫停'); jp1.add(jb2); // jb1.setBounds(200,50, 40, 20); JButton jb3 = new JButton('清除'); jp1.add(jb3); // jb1.setBounds(300,50, 40, 20); JButton jb4 = new JButton('自動添加'); jp1.add(jb4); jf.add(jp1,BorderLayout.NORTH); Mouse mouse = new Mouse(); Color[] color = {Color.RED,Color.BLUE,Color.BLACK,Color.GREEN,Color.YELLOW}; for(int i=0;i<color.length;i++){ JButton jbu = new JButton(); jbu.setBackground(color[i]); jbu.setPreferredSize(new Dimension(30, 30)); jp1.add(jbu); jbu.addActionListener(mouse); } jb1.addActionListener(mouse); jb2.addActionListener(mouse); jb3.addActionListener(mouse); jb4.addActionListener(mouse); jf.addMouseListener(mouse); jf.addMouseMotionListener(mouse); BallJpanel cp = new BallJpanel(); cp.setBackground(Color.WHITE); jf.add(cp,BorderLayout.CENTER); jf.setVisible(true); Graphics g = cp.getGraphics(); mouse.setcp(cp); mouse.setg(g); mouse.setarrayball(arrayball); mouse.setmouse(mouse); cp.setarrayball(arrayball); }}

這是窗體的基本配置,采用邊框布局,上方放置按鈕,中間是畫布。我們為按鈕添加了動作監聽器,并使用了一系列的方法來把對象傳遞到其他類中。

public class Ball { public int size = 90; // 小球的直徑 public int x = 500; // 小球所在的x坐標 public int y = 500; // 小球所在的y坐標 public int vx = 5; public int vy = 5; public BallJpanel cp; public Color color = Color.BLACK; public int max_x, max_y, Min_x, Min_y; private Ball[] arrayball; public void setcp(BallJpanel cp) { this.cp = cp; } public void setarrayball(Ball[] arrayball) { this.arrayball = arrayball; } public void setX(int x) { this.x = x; } public int getX() { return x; } public void setY(int y) { this.y = y; } public int setY() { return y; } public Ball(int x, int y, int vx, int vy, Color color) { this.x = x; this.y = y; this.vx = vx; this.vy = vy; this.color = color; } public void ballMove(Graphics g) { x += vx; y += vy; max_y = cp.getHeight(); max_x = cp.getWidth(); if (x <= size / 2) { x = size / 2; vx = -vx; } if (y <= size / 2) { y = size / 2; vy = -vy; } if (x + size / 2 >= max_x) { x = max_x - size / 2; vx = -vx; } if (y + size / 2 >= max_y) { y = max_y - size / 2; vy = -vy; } for (int i = 0; i < arrayball.length; i++) { if (arrayball[i] == null) break; Ball ball = arrayball[i]; if (this.equals(ball)) continue; if ((ball.x - this.x) * (ball.x - this.x) + (ball.y - this.y) * (ball.y - this.y) <= size * size) { int tempvx = this.vx; int tempvy = this.vy; this.vx = ball.vx; this.vy = ball.vy; ball.vx = tempvx; ball.vy = tempvy; while ((ball.x - this.x) * (ball.x - this.x) + (ball.y - this.y) * (ball.y - this.y) <= size * size) { this.x += this.vx; this.y += this.vy; System.out.println('等待'); } } } }}

考慮到這是一個小球的運動系統,我們為小球寫了一個類,添加小球的時候,會創建小球對象,并使其獲得位置,顏色,速度等參數,并將其存入數組。小球的方法就是運動,每當執行ballMove方法,便會為小球修改位置坐標(基于其速度),再判斷是否撞擊邊框,以及判斷是否和別的小球有坐標重疊,如果有重疊,則跑一個循環,修改位置坐標,使其分離。Ball這部分代碼和監聽器中的方法有所聯系,我們接下來介紹監聽器的方法。

public class Mouse implements MouseMotionListener, MouseListener, ActionListener { private Graphics g; private BallJpanel cp; private Ball[] arrayball; private int index = 0; private int x; private int y; private int vx; private int vy; private int random=1; private Color color=Color.black; private ThreadBall tb; private Mouse mouse; public int selfFlag=0; public void setmouse(Mouse mouse) { this.mouse= mouse; } public void setarrayball(Ball[] arrayball) { this.arrayball = arrayball; } public void setg(Graphics g) { this.g = g; } public void setcp(BallJpanel cp) { this.cp = cp; } public void actionPerformed(ActionEvent e) { if ('添加'.equals(e.getActionCommand())) { System.out.println('添加'); if (tb == null) { // 創建線程對象 tb = new ThreadBall(); tb.setcp(cp); tb.setarrayball(arrayball); tb.setg(g); tb.start(); tb.setmouse(mouse); } tb.stopFlag=0; addBall(); } if ('暫停'.equals(e.getActionCommand())) { if(tb!=null) { if(tb.stopFlag==0) { tb.stopFlag=1; System.out.println('暫停'); } else { tb.stopFlag=0; System.out.println('開始'); } } } if ('清除'.equals(e.getActionCommand())) { tb.stopFlag=1; cp.paint1(g); index=0; System.out.println('清除'); } if ('自動添加'.equals(e.getActionCommand())){ if(selfFlag==0) {selfFlag=1;System.out.println('自動添加打開');} else {selfFlag=0;System.out.println('自動添加關閉');} } if(''.equals(e.getActionCommand())){ JButton jbu=(JButton)e.getSource(); color=jbu.getBackground(); g.setColor(color); } } public void mouseDragged(MouseEvent e) { } public void mouseMoved(MouseEvent e) { } public void mouseClicked(MouseEvent e) { } public void mousePressed(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void addBall() { x = 500; y = 500; random=1+(int)(Math.random()*4); switch(random) { case 1: vx=5; vy=5; break; case 2: vx=-5; vy=-5; break; case 3: vx=5; vy=-5; break; case 4: vx=-5; vy=5; break; } Ball ball = new Ball(x, y,vx , vy, color); arrayball[index++] = ball; }}

監聽器中,我們設置了一系列參數來控制一些方法的開啟和關閉,以及寫了添加小球的方法,為其賦初值,隨機一個初始發射方向。這段代碼我們用到了線程。線程的使用分為兩步,創建線程對象并start線程。

public class ThreadBall extends Thread { private Graphics g; private BallJpanel cp; private Ball[] arrayball; public int stopFlag=0; private int add=0; private Mouse mouse; public void setmouse(Mouse mouse) { this.mouse=mouse; } public void setcp(BallJpanel cp) { this.cp = cp; } public void setg(Graphics g) { this.g=g; } public void setarrayball(Ball[] arrayball) { this.arrayball = arrayball; } /** * 啟動線程執行的方法 */ public void run() { while (true) { if(stopFlag==0) { for (int i = 0; i < arrayball.length; i++) { if(arrayball[i]==null) break; Ball ball = arrayball[i];ball.setarrayball(arrayball); ball.setcp(cp); ball.ballMove(g); } cp.paint(g); add++; if(add==5000) add=0; if(add%50==0&&mouse.selfFlag==1) mouse.addBall(); } try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } }}

以上是線程的屬性和方法,此類繼承Thread并重寫了run方法。run方法的思路是循環調用ballMove方法修改小球坐標,并調用paint方法更新顯示,我們加入了一個延時函數,來控制調用的頻率。

public class BallJpanel extends JPanel { private Ball[] arrayball; public void setarrayball(Ball[] arrayball) { this.arrayball=arrayball; } public void paint(Graphics g) { super.paint(g); for(int i=0;i<arrayball.length;i++) { if(arrayball[i]==null) { break; } Ball ball=arrayball[i]; g.setColor(ball.color); g.fillOval(ball.x-ball.size/2, ball.y-ball.size/2, ball.size, ball.size); } } public void paint1(Graphics g) { super.paint(g); for(int i=0;i<arrayball.length;i++) { if(arrayball[i]==null) { break; } arrayball[i]=null; } } }

BallJpanel類寫的是畫布,及小球的運動區域,畫筆也是從其對象cp上獲得。類里用paint寫畫面的重繪方法(包括畫板小球的重繪),paint1用來清空畫布及數組。

以上便是java小球運動的全部代碼,我們來看一下效果。

java實現小球碰撞功能

java實現小球碰撞功能

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Java
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
午夜视频一区| 日韩午夜在线| 午夜视频久久久久久| 国产亚洲欧美日韩日本| 99re热精品| 国产精品久久久久精k8| 久久高清免费观看| 欧美激情资源网| 99精品黄色片免费大全| 久久亚洲午夜电影| 久久狠狠亚洲综合| 欧美日韩激情一区二区| 亚洲欧洲av另类| 欧美高清激情brazzers| 性色av一区二区怡红| 国产最新精品免费| 久久99精品久久久久久| 欧美在线播放高清精品| 久久夜色精品国产噜噜av| 日韩在线卡一卡二| 亚洲在线一区二区三区| 国产欧美69| 亚洲精品中文在线观看| 在线观看亚洲| 亚洲免费观看高清| 国产午夜久久| 亚洲成人第一页| 国产日韩精品久久| 一区二区在线观看不卡| 国产精品一区在线播放| 亚洲一区自拍偷拍| 久久久水蜜桃av免费网站| 青椒成人免费视频| 欧美区视频在线观看| 国产麻豆日韩欧美久久| 欧美一级日韩不卡播放免费| 国产精品69毛片高清亚洲| 欧美一区二区性放荡片| 成人av网站大全| 久久久精品国产99久久精品芒果| 欧美日本不卡| 亚洲人成亚洲人成在线观看图片| 亚洲精品欧洲| 日韩精品一二三区| 欧美美女bb生活片| 风间由美性色一区二区三区| 精品国产凹凸成av人网站| 欧美jizzhd精品欧美喷水 | 国产一区二区黄色| 午夜精品久久久久久久久久久| 亚洲情趣在线观看| 国产欧美在线| 久久精品国产一区二区三区免费看| 欧美日韩国产精品自在自线| 欧美日韩免费观看一区=区三区| 国产精品高清亚洲| 国产日韩欧美一区| 国产精品91一区二区| 91在线免费视频观看| 国产精品乱码人人做人人爱| 国产精品制服诱惑| 精品一区二区三区的国产在线播放| 欧美一卡二卡三卡四卡| 99久久久久久99| 中文字幕中文字幕在线一区| 国产精品亚洲不卡a| 麻豆91在线观看| 精品国产电影一区二区| 日韩一区二区免费看| 日本不卡在线视频| 69精品人人人人| 国色天香一区二区| 日韩黄色免费电影| 欧美电影免费观看高清完整版在线 | 亚洲小少妇裸体bbw| 久久久福利视频| 日韩avvvv在线播放| 日韩欧美在线1卡| 精品1区2区3区4区| 日本免费在线视频不卡一不卡二| 精品对白一区国产伦| 国产欧美日韩综合精品二区| 国产精品亚洲一区二区三区妖精 | 国产乱对白刺激视频不卡| 久久综合久色欧美综合狠狠| 国产亚洲精品v| 国产成人在线看| 国产精品久久夜| 欧美区视频在线观看| 狠狠综合久久av一区二区老牛| 琪琪久久久久日韩精品| 久久久久久电影| 色先锋资源久久综合| 色综合中文字幕| 日韩精品电影在线观看| 久久久亚洲国产美女国产盗摄 | 欧美午夜精品电影| 91美女在线观看| 美日韩黄色大片| 国产精品久久久久久亚洲伦| 欧美日韩精品系列| 狠狠久久婷婷| 激情欧美一区二区三区在线观看| 国产精品私房写真福利视频| 欧美午夜视频网站| 亚洲国产精品第一区二区三区| 韩国v欧美v日本v亚洲v| 亚洲精品国产a久久久久久| 欧美一区二区三区不卡| 国产亚洲在线观看| 成人av网在线| 美女脱光内衣内裤视频久久影院| 欧美国产日本韩| 欧美久久久久久蜜桃| 国产精品日韩二区| 91亚洲精品久久久蜜桃| 久久成人麻豆午夜电影| 亚洲视频精选在线| 欧美刺激午夜性久久久久久久| 久久福利精品| 国产精品国产三级欧美二区| 国产综合一区二区| 亚洲国产美女搞黄色| 亚洲国产激情av| 日韩一级片网站| 一本高清dvd不卡在线观看| 91蝌蚪porny| 麻豆国产欧美日韩综合精品二区| ...xxx性欧美| 久久综合资源网| 欧美日韩视频一区二区| 亚洲人成在线影院| 粉嫩久久99精品久久久久久夜| 亚洲国产日产av| 中文字幕一区二区三区四区不卡| 精品99一区二区| 欧美精品在线视频| 久久久久久久久久久一区| 亚洲香蕉网站| 91在线国产观看| 国产综合色在线视频区| 天堂精品中文字幕在线| 亚洲国产精品ⅴa在线观看| 91精品蜜臀在线一区尤物| 亚洲一区二区网站| 欧美日韩在线高清| 成人免费黄色大片| 国产一区二区精品久久91| 三级久久三级久久久| 一区二区高清免费观看影视大全| 国产精品国产自产拍高清av王其 | 成人av网址在线| 国产毛片精品视频| 麻豆精品视频在线观看视频| 亚洲精品日日夜夜| 中文字幕一区二区三区在线观看 | 91精品一区二区三区在线观看| 在线看日本不卡| 久久五月激情| 六月婷婷久久| 免费久久久一本精品久久区| 99精品视频免费观看视频| 精品91免费| 在线观看欧美亚洲| 亚洲国产美女 | 亚洲国产专区校园欧美| 女生裸体视频一区二区三区| 波多野结衣一区二区三区| 丁香网亚洲国际| 成人精品一区二区三区四区| 国产99久久精品| 大胆亚洲人体视频| 成人福利视频在线| 成人在线综合网| a亚洲天堂av| 99精品在线观看视频| 97久久精品人人澡人人爽| www.欧美亚洲| proumb性欧美在线观看| 国产一本一道久久香蕉| 国产一区二区主播在线| 国产一区二区91| 国产成人午夜精品影院观看视频 | 成人毛片在线观看| 99精品视频在线免费观看| www.亚洲国产| 欧美国产免费| 欧美成人亚洲| 精品成人久久| 亚洲精选久久| 国产一区二区三区久久| 男女精品网站| 久久久久91| 欧美性色欧美a在线播放| 欧美日韩精品欧美日韩精品一 | 日韩一区国产二区欧美三区| 精品国产一区久久| 中文字幕二三区不卡| 中文字幕一区二区三区乱码在线| 亚洲精品视频在线观看免费|