/**
*设计声明:
*1、本次设计是模仿QQ炫舞类游戏,当图标到红色的检测区域时,按下正确的方向键,
*将会得到goodnice,运行一下您就懂了;
*2、本设计没有在配色、视觉效果上作改善,主要是因为个人对那些方面不懂,所以以这
*种简陋的形式呈现给大家,望大家海涵;
*3、如果有朋友要写本程序,请注意按键监听的聚焦面板一定要能够获得聚焦,要不然,
*按键会失效,如本程序中的dancingPlay.setFocusable(true);很重要。
*
*注意事项:
*1、本程序为java程序,同时感谢您花费宝贵的时间来阅读本文档;
*2、请注意包名为:dance,文件名为:DancingPlay,请注意检查,
*以防一些不必要的麻烦;
*3、在完成确认2中的内容后,本程序可以直接运行,因为本软件说明都在注释中;
*4、本设计是继以前的一些设计写的,所以在面已说明的东西,不再详述,同时由于个人能力、阅历等
*原因,有些细节可能并没有详细阐述,或者有疏漏,请谅解。
*设计思路:
*1、每一个方向图标采用了仿俄罗斯方块(tetis)的工厂方法产生,所以每个方向块都是一个对象,
*是由类DanceDirection创建的;
*2、用一个队列(queue)保存屏幕上的DanceDirection;
*3、用一个线程完成DanceDirection在queue的添加,删除,以及queue中的DanceDirection的下落;
*4、添加按键监听事件,用于判断处于检测区域是否有DanceDirection以及是否正确。
*
*/packagedance;
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;
publicclassDancingPlayextendsJPanel{
/**
*时间计数器,主要用于在一定间隔时间里添加一个DanceDirection
*/
privatelongtimeCount=0;
/**
*检测框的长度,在软件中就是那个红色的框的长度
*/
privateintsquare=DanceDirection.FRAME_LENGTH+6;
/**
*当按键和方向标在红色框的检测范围内,且按键正确时,会被幅值为true
*/
privatebooleanniceFlag=false;
/**
*用于对goodnice显示时间进行计数
*/
privateintdispointNiceString=10;
/**
*使用LinkedList保存当前有的图标
*/
privateQueuequeue=newLinkedList();
/**
*1.绘制queue中的方向图标
*2.绘制红色的检测区域
*3.绘制goodnice
*/
@Override
publicvoidpaint(Graphicsgraphics){
super.paint(graphics);
drawDerction(graphics);
drawSquare(graphics);
drawNice(graphics);
}
/**
*使用迭代器,从queue中提取方向键,并调用对应的绘图功能,将图绘制在面板上
*@paramgraphics
*/
privatevoiddrawDerction(Graphicsgraphics){
Iteratoriterator=queue.iterator();
while(iterator.hasNext()){
iterator.next().drawImage(graphics);
}
}
/**
*绘制goodnice
*1.先改变颜色
*2.将字体字号改成合适的
*@paramgraphics
*/
privatevoiddrawNice(Graphicsgraphics){
if(niceFlag){
graphics.setColor(Color.red);
Fontfont=graphics.getFont();
Fontfont2=newFont(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);
}
}
/**
*绘制红色的检测区域
*@paramgraphics
*/
privatevoiddrawSquare(Graphicsgraphics){
graphics.setColor(Color.red);
for(inti=0;i
graphics.drawRoundRect(1024/2-(square+i)/2,500-i/2,square+i,square+i,5,5);
}
}
publicstaticvoidmain(String[]args){
JFramejFrame=newJFrame();
DancingPlaydancingPlay=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.按键按下时,是否有方向图标在检测范围内,
*2.如果有,在检查图标的方向与按键的方向是否一致,
*3.如果一致,niceFlag赋为true
*@paramkeyNumber
*/
publicvoidcheckKey(intkeyNumber){
Iteratoriterator=queue.iterator();
while(iterator.hasNext()){
DanceDirectiondanceDirection=iterator.next();
if(Math.abs(danceDirection.positionY-500)<=30
&&danceDirection.direction==keyNumber){
niceFlag=true;
}
}
}
/**
*1.用于添加键盘监听事件
*2.启动一个线程维护动态效果
*/
publicvoidrun(){
this.addKeyListener(newKeyAdapter(){
@Override
publicvoidkeyPressed(KeyEvente){
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();
}
});
Threadthread=newThread(){
publicvoidrun(){
while(true){
try{
//1.完成对queue中每个DanceDirection的positionY加如相应的下移值
//2.将不再屏幕范围内的DanceDirection移除
Iteratoriterator=queue.iterator();
while(iterator.hasNext()){
DanceDirectiondanceDirection=iterator.next();
if(danceDirection.positionY>=768){
iterator.remove();
}
danceDirection.positionY+=6;
}
//检查计算goodnice的显示时间
if(niceFlag){
dispointNiceString++;
if(dispointNiceString>=10){
niceFlag=false;
dispointNiceString=0;
}
}
//1.每20*25秒添加一次图标
//2.添加的方式为随即添加,目前的概率为2/3
if(timeCount++%25==0){
if(Math.random()*4>1){
queue.offer(DanceDirection.getInstance());
}
}
Thread.sleep(20);
}catch(InterruptedExceptione){
e.printStackTrace();
}
repaint();
}
}
};
thread.start();
}
}
classDanceDirection{
/**
*图标框的边长
*/
publicstaticfinalintFRAME_LENGTH=50;
/**
*方向键右的常量
*/
publicstaticfinalintRIGHT=1;
/**
*方向键左的常量
*/
publicstaticfinalintLEFT=2;
/**
*方向键上的常量
*/
publicstaticfinalintUP=3;
/**
*方向键下的常量
*/
publicstaticfinalintDOWN=4;
/**
*每个DanceDirection的初始X,Y坐标
*/
publicintpositionX=1024/2;
publicintpositionY=0-FRAME_LENGTH;
/**
*方向值
*/
protectedintdirection;
/**
*私有构造函数
*/
privateDanceDirection(){
}
/**
*静态的工厂方法
*@return
*/
publicstaticDanceDirectiongetInstance(){
returnnewDance();
}
/**
*为工厂构造方法提供的静态类,为了得到随即的方向图标
*@authorsoft1
*
*/
staticclassDanceextendsDanceDirection{
publicDance(){
direction=(int)(Math.random()*4+1);
}
}
/**
*方向图标绘制函数
*@paramgraphics
*/
publicvoiddrawImage(Graphicsgraphics){
graphics.setColor(Color.blue);
graphics.fillRoundRect(positionX-FRAME_LENGTH/2,
positionY,
FRAME_LENGTH,
FRAME_LENGTH,
FRAME_LENGTH/5,
FRAME_LENGTH/5);
switch(direction){
case1:
rightDirection(graphics);
break;
case2:
leftDirection(graphics);
break;
case3:
upDirection(graphics);
break;
case4:
downDirection(graphics);
break;
}
}
/**
*方向向左
*@paramgraphics
*/
privatevoidleftDirection(Graphicsgraphics){
graphics.setColor(Color.yellow);
for(inti=0;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
*/
privatevoiddownDirection(Graphicsgraphics){
graphics.setColor(Color.green);
for(inti=0;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
*/
privatevoidrightDirection(Graphicsgraphics){
graphics.setColor(Color.magenta);
for(inti=0;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
*/
privatevoidupDirection(Graphicsgraphics){
graphics.setColor(Color.pink);
for(inti=0;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);
}
}
@Override
publicStringtoString(){
return"direciton:"+direction+"\tpositionX:"+positionX+"\tpositionY:"+positionY;
}
}