java炫舞_Java 炫舞按键功能 DancingPlay (整理)
/*** Java 炫舞按鍵功能 DancingPlay (整理)
* 2016-1-2 深圳 南山平山村 曾劍鋒
*
* 設(shè)計(jì)聲明:
* 1、本次設(shè)計(jì)是模仿QQ炫舞類游戲,當(dāng)圖標(biāo)到紅色的檢測(cè)區(qū)域時(shí),按下正確的方向鍵,
* 將會(huì)得到good nice,運(yùn)行一下您就懂了;
* 2、本設(shè)計(jì)沒有在配色、視覺效果上作改善,主要是因?yàn)閭€(gè)人對(duì)那些方面不懂,所以以這
* 種簡(jiǎn)陋的形式呈現(xiàn)給大家,望大家海涵;
* 3、如果有朋友要寫本程序,請(qǐng)注意按鍵監(jiān)聽的聚焦面板一定要能夠獲得聚焦,要不然,
* 按鍵會(huì)失效,如本程序中的dancingPlay.setFocusable(true);很重要。
*
* 注意事項(xiàng):
* 1、本程序?yàn)閖ava程序,同時(shí)感謝您花費(fèi)寶貴的時(shí)間來閱讀本文檔;
* 2、請(qǐng)注意包名為:dance,文件名為:DancingPlay,請(qǐng)注意檢查,
* 以防一些不必要的麻煩;
* 3、在完成確認(rèn)2中的內(nèi)容后,本程序可以直接運(yùn)行,因?yàn)楸拒浖f明都在注釋中;
* 4、本設(shè)計(jì)是繼以前的一些設(shè)計(jì)寫的,所以在面已說明的東西,不再詳述,同時(shí)由于個(gè)人能力、閱歷等
* 原因,有些細(xì)節(jié)可能并沒有詳細(xì)闡述,或者有疏漏,請(qǐng)諒解。
* 設(shè)計(jì)思路:
* 1、 每一個(gè)方向圖標(biāo)采用了仿俄羅斯方塊(tetis)的工廠方法產(chǎn)生,所以每個(gè)方向塊都是一個(gè)對(duì)象,
* 是由類DanceDirection創(chuàng)建的;
* 2、 用一個(gè)隊(duì)列(queue)保存屏幕上的DanceDirection;
* 3、 用一個(gè)線程完成DanceDirection在queue的添加,刪除,以及queue中的DanceDirection的下落;
* 4、 添加按鍵監(jiān)聽事件,用于判斷處于檢測(cè)區(qū)域是否有DanceDirection以及是否正確。
**/
packagedemo;importjava.awt.Color;importjava.awt.Font;importjava.awt.Graphics;importjava.awt.Toolkit;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.util.Iterator;importjava.util.LinkedList;importjava.util.Queue;importjavax.swing.JFrame;importjavax.swing.JPanel;public class DancingPlay extendsJPanel{/*** 時(shí)間計(jì)數(shù)器,主要用于在一定間隔時(shí)間里添加一個(gè)DanceDirection*/
private long timeCount = 0;/*** 檢測(cè)框的長(zhǎng)度,在軟件中就是那個(gè)紅色的框的長(zhǎng)度*/
private int square = DanceDirection.FRAME_LENGTH+6;/*** 當(dāng)按鍵和方向標(biāo)在紅色框的檢測(cè)范圍內(nèi),且按鍵正確時(shí),會(huì)被幅值為true*/
private boolean niceFlag = false;/*** 用于對(duì)good nice顯示時(shí)間進(jìn)行計(jì)數(shù)*/
private int dispointNiceString = 10;/*** 使用LinkedList保存當(dāng)前有的圖標(biāo)*/
private Queue queue = new LinkedList();/*** 1. 繪制queue中的方向圖標(biāo)
* 2. 繪制紅色的檢測(cè)區(qū)域
* 3. 繪制good nice*/@Overridepublic voidpaint(Graphics graphics) {super.paint(graphics);
drawDerction(graphics);
drawSquare(graphics);
drawNice(graphics);
}/*** 使用迭代器,從queue中提取方向鍵,并調(diào)用對(duì)應(yīng)的繪圖功能,將圖繪制在面板上
*@paramgraphics*/
private voiddrawDerction(Graphics graphics) {
Iterator iterator =queue.iterator();while(iterator.hasNext()) {
iterator.next().drawImage(graphics);
}
}/*** 繪制good nice
* 1. 先改變顏色
* 2. 將字體字號(hào)改成合適的
*@paramgraphics*/
private voiddrawNice(Graphics graphics) {if(niceFlag) {
graphics.setColor(Color.red);
Font font=graphics.getFont();
Font font2= new Font(font.getName(), font.getStyle(), font.getSize()+100);
graphics.setFont(font2);
graphics.drawString("good", 1024/2-square-280, 600);
graphics.drawString("nice", 1024/2+square, 600);
}
}/*** 繪制紅色的檢測(cè)區(qū)域
*@paramgraphics*/
private voiddrawSquare(Graphics graphics) {
graphics.setColor(Color.red);for (int i = 0; i < 6; i+=2) {
graphics.drawRoundRect(1024/2-(square+i)/2, 500-i/2, square+i, square+i, 5, 5);
}
}public static voidmain(String[] args) {
JFrame jFrame= newJFrame();
DancingPlay dancingPlay= newDancingPlay();
jFrame.setSize(1024, 768);
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//將jFrame居中
jFrame.setLocation( (Toolkit.getDefaultToolkit().getScreenSize().width-1024)/2,
(Toolkit.getDefaultToolkit().getScreenSize().height-768)/2);
jFrame.add(dancingPlay);
dancingPlay.setFocusable(true);
dancingPlay.run();
jFrame.setVisible(true);
}/*** 1. 按鍵按下時(shí),是否有方向圖標(biāo)在檢測(cè)范圍內(nèi),
* 2. 如果有,在檢查圖標(biāo)的方向與按鍵的方向是否一致,
* 3. 如果一致,niceFlag賦為true
*@paramkeyNumber*/
public void checkKey(intkeyNumber){
Iterator iterator =queue.iterator();while(iterator.hasNext()) {
DanceDirection danceDirection=iterator.next();if (Math.abs(danceDirection.positionY - 500) <= 30
&& danceDirection.direction ==keyNumber) {
niceFlag= true;
}
}
}/*** 1.用于添加鍵盤監(jiān)聽事件
* 2.啟動(dòng)一個(gè)線程維護(hù)動(dòng)態(tài)效果*/
public voidrun(){this.addKeyListener(newKeyAdapter() {
@Overridepublic voidkeyPressed(KeyEvent e) {switch(e.getKeyCode()) {caseKeyEvent.VK_UP:
checkKey(3);break;caseKeyEvent.VK_RIGHT:
checkKey(1);break;caseKeyEvent.VK_LEFT:
checkKey(2);break;caseKeyEvent.VK_DOWN:
checkKey(4);break;
}
repaint();
}
});
Thread thread= newThread(){public voidrun(){while (true) {try{//1. 完成對(duì)queue中每個(gè)DanceDirection的positionY加如相應(yīng)的下移值//2. 將不再屏幕范圍內(nèi)的DanceDirection移除
Iterator iterator =queue.iterator();while(iterator.hasNext()) {
DanceDirection danceDirection=iterator.next();if (danceDirection.positionY >= 768) {
iterator.remove();
}
danceDirection.positionY+= 6;
}//檢查計(jì)算good nice的顯示時(shí)間
if(niceFlag) {
dispointNiceString++;if (dispointNiceString >= 10) {
niceFlag= false;
dispointNiceString= 0;
}
}//1. 每20*25秒添加一次圖標(biāo)//2. 添加的方式為隨即添加,目前的概率為2/3
if(timeCount++%25 == 0){if (Math.random()*4 > 1) {
queue.offer(DanceDirection.getInstance());
}
}
Thread.sleep(20);
}catch(InterruptedException e) {
e.printStackTrace();
}
repaint();
}
}
};
thread.start();
}
}classDanceDirection {/*** 圖標(biāo)框的邊長(zhǎng)*/
public static final int FRAME_LENGTH = 50;/*** 方向鍵右的常量*/
public static final int RIGHT = 1;/*** 方向鍵左的常量*/
public static final int LEFT = 2;/*** 方向鍵上的常量*/
public static final int UP = 3;/*** 方向鍵下的常量*/
public static final int DOWN = 4;/*** 每個(gè)DanceDirection的初始X,Y坐標(biāo)*/
public int positionX = 1024/2;public int positionY = 0-FRAME_LENGTH;/*** 方向值*/
protected intdirection;/*** 私有構(gòu)造函數(shù)*/
privateDanceDirection(){
}/*** 靜態(tài)的工廠方法
*@return
*/
public staticDanceDirection getInstance(){return newDance();
}/*** 為工廠構(gòu)造方法提供的靜態(tài)類,為了得到隨即的方向圖標(biāo)
*@authorsoft1
**/
static class Dance extendsDanceDirection{publicDance() {
direction= (int)(Math.random()*4+1);
}
}/*** 方向圖標(biāo)繪制函數(shù)
*@paramgraphics*/
public voiddrawImage(Graphics graphics) {
graphics.setColor(Color.blue);
graphics.fillRoundRect( positionX-FRAME_LENGTH/2,
positionY,
FRAME_LENGTH,
FRAME_LENGTH,
FRAME_LENGTH/5,
FRAME_LENGTH/5);switch(direction) {case 1:
rightDirection(graphics);break;case 2:
leftDirection(graphics);break;case 3:
upDirection(graphics);break;case 4:
downDirection(graphics);break;
}
}/*** 方向向左
*@paramgraphics*/
private voidleftDirection(Graphics graphics) {
graphics.setColor(Color.yellow);for (int i = 0; i < 3; i++) {int[] arrayX = {positionX-FRAME_LENGTH/2+2+15*i,
positionX-FRAME_LENGTH/2+2+15+15*i,
positionX-FRAME_LENGTH/2+2+15+15*i};int[] arrayY = {positionY+FRAME_LENGTH/2,
positionY+FRAME_LENGTH/2-20,
positionY+FRAME_LENGTH/2+20};
graphics.fillPolygon(arrayX, arrayY, arrayX.length);
}
}/*** 方向向下
*@paramgraphics*/
private voiddownDirection(Graphics graphics) {
graphics.setColor(Color.green);for (int i = 0; i < 3; i++) {int[] arrayX ={positionX,
positionX+20,
positionX-20};int[] arrayY = {positionY+FRAME_LENGTH-2-15*i,
positionY+FRAME_LENGTH-2-15-15*i,
positionY+FRAME_LENGTH-2-15-15*i};
graphics.fillPolygon(arrayX, arrayY, arrayX.length);
}
}/*** 方向向右
*@paramgraphics*/
private voidrightDirection(Graphics graphics) {
graphics.setColor(Color.magenta);for (int i = 0; i < 3; i++) {int[] arrayX = {positionX+FRAME_LENGTH/2-2-15*i,
positionX+FRAME_LENGTH/2-2-15-15*i,
positionX+FRAME_LENGTH/2-2-15-15*i};int[] arrayY = {positionY+FRAME_LENGTH/2,
positionY+FRAME_LENGTH/2+20,
positionY+FRAME_LENGTH/2-20};
graphics.fillPolygon(arrayX, arrayY, arrayX.length);
}
}/*** 方向向上
*@paramgraphics*/
private voidupDirection(Graphics graphics) {
graphics.setColor(Color.pink);for (int i = 0; i < 3; i++) {int[] arrayX ={positionX,
positionX+20,
positionX-20};int[] arrayY = {positionY+15*i,
positionY+2+15+15*i,
positionY+2+15+15*i};
graphics.fillPolygon(arrayX, arrayY, arrayX.length);
}
}
@OverridepublicString toString() {return "direciton:"+direction+"\tpositionX:"+positionX+"\tpositionY:"+positionY;
}
}
總結(jié)
以上是生活随笔為你收集整理的java炫舞_Java 炫舞按键功能 DancingPlay (整理)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: layui导出html到pdf,layu
- 下一篇: delphi开发LINUX程序,DELP