/**

* 设计声明:

* 1、本次设计是模仿QQ炫舞类游戏,当图标到红色的检测区域时,按下正确的方向键,

* 将会得到good nice,运行一下您就懂了;

* 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以及是否正确。

*

*/

package dance;

import java.awt.Color;

import java.awt.Font;

import java.awt.Graphics;

import java.awt.Toolkit;

import java.awt.event.KeyAdapter;

import java.awt.event.KeyEvent;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.Queue;

import javax.swing.JFrame;

import javax.swing.JPanel;

public class DancingPlay extends JPanel{

/**

* 时间计数器,主要用于在一定间隔时间里添加一个DanceDirection

*/

private long timeCount = 0;

/**

* 检测框的长度,在软件中就是那个红色的框的长度

*/

private int square = DanceDirection.FRAME_LENGTH+6;

/**

* 当按键和方向标在红色框的检测范围内,且按键正确时,会被幅值为true

*/

private boolean niceFlag = false;

/**

* 用于对good nice显示时间进行计数

*/

private int dispointNiceString = 10;

/**

* 使用LinkedList保存当前有的图标

*/

private Queue queue = new LinkedList ();

/**

* 1. 绘制queue中的方向图标

* 2. 绘制红色的检测区域

* 3. 绘制good nice

*/

@Override

public void paint(Graphics graphics) {

super.paint(graphics);

drawDerction(graphics);

drawSquare(graphics);

drawNice(graphics);

}

/**

* 使用迭代器,从queue中提取方向键,并调用对应的绘图功能,将图绘制在面板上

* @param graphics

*/

private void drawDerction(Graphics graphics) {

Iterator iterator = queue.iterator();

while (iterator.hasNext()) {

iterator.next().drawImage(graphics);

}

}

/**

* 绘制good nice

* 1. 先改变颜色

* 2. 将字体字号改成合适的

* @param graphics

*/

private void drawNice(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);

}

}

/**

* 绘制红色的检测区域

* @param graphics

*/

private void drawSquare(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 void main(String[] args) {

JFrame jFrame = new JFrame();

DancingPlay dancingPlay = new DancingPlay();

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

* @param keyNumber

*/

public void checkKey(int keyNumber){

Iterator iterator = queue.iterator();

while (iterator.hasNext()) {

DanceDirection danceDirection = iterator.next();

if (Math.abs(danceDirection.positionY - 500) <= 30

&& danceDirection.direction == keyNumber) {

niceFlag = true;

}

}

}

/**

* 1.用于添加键盘监听事件

* 2.启动一个线程维护动态效果

*/

public void run(){

this.addKeyListener(new KeyAdapter() {

@Override

public void keyPressed(KeyEvent e) {

switch (e.getKeyCode()) {

case KeyEvent.VK_UP:

checkKey(3);

break;

case KeyEvent.VK_RIGHT:

checkKey(1);

break;

case KeyEvent.VK_LEFT:

checkKey(2);

break;

case KeyEvent.VK_DOWN:

checkKey(4);

break;

}

repaint();

}

});

Thread thread = new Thread(){

public void run(){

while (true) {

try {

//1. 完成对queue中每个DanceDirection的positionY加如相应的下移值

//2. 将不再屏幕范围内的DanceDirection移除

Iterator iterator = queue.iterator();

while (iterator.hasNext()) {

DanceDirection danceDirection = iterator.next();

if (danceDirection.positionY >= 768) {

iterator.remove();

}

danceDirection.positionY += 6;

}

//检查计算good nice的显示时间

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 (InterruptedException e) {

e.printStackTrace();

}

repaint();

}

}

};

thread.start();

}

}

class DanceDirection {

/**

* 图标框的边长

*/

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;

/**

* 每个DanceDirection的初始X,Y坐标

*/

public int positionX = 1024/2;

public int positionY = 0-FRAME_LENGTH;

/**

* 方向值

*/

protected int direction;

/**

* 私有构造函数

*/

private DanceDirection(){

}

/**

* 静态的工厂方法

* @return

*/

public static DanceDirection getInstance(){

return new Dance();

}

/**

* 为工厂构造方法提供的静态类,为了得到随即的方向图标

* @author soft1

*

*/

static class Dance extends DanceDirection{

public Dance() {

direction = (int)(Math.random()*4+1);

}

}

/**

* 方向图标绘制函数

* @param graphics

*/

public void drawImage(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;

}

}

/**

* 方向向左

* @param graphics

*/

private void leftDirection(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);

}

}

/**

* 方向向下

* @param graphics

*/

private void downDirection(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);

}

}

/**

* 方向向右

* @param graphics

*/

private void rightDirection(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);

}

}

/**

* 方向向上

* @param graphics

*/

private void upDirection(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);

}

}

@Override

public String toString() {

return "direciton:"+direction+"\tpositionX:"+positionX+"\tpositionY:"+positionY;

}

}

原文:http://teny32.blog.51cto.com/8027509/1371561

java炫舞_仿QQ炫舞按键功能--Java原创新作品相关推荐

  1. java实现qq炫舞音乐播放功能_仿QQ炫舞按键功能--Java原创新作品

    /** *  设计声明: *         1.本次设计是模仿QQ炫舞类游戏,当图标到红色的检测区域时,按下正确的方向键, *                 将会得到good nice,运行一下您 ...

  2. linux(ubuntu)下基于java的在线音乐仿qq播放器,

    linux下基于java的在线音乐仿qq播放器,界面挺漂亮,界面全都是本人自己用java来画的,主要是我自己喜欢用ubuntu,但是由于没有人去做它的播放器,就自己来了,可以在线,有专辑图片,播放列表 ...

  3. 仿QQ聊天程序(java)

    仿QQ聊天程序(java) 2014年03月17日 15:52:47 标签: java / 聊天 / 仿QQ 90246 仿QQ聊天程序 转载出处: https://blog.csdn.net/u01 ...

  4. 复习Java第二个项目仿QQ聊天系统 03(两种通信类、登录以及注册功能完善) Java面试题并发编程相关知识生活【记录一个咸鱼大学生三个月的奋进生活】025

    记录一个咸鱼大学生三个月的奋进生活025 复习Java(仿QQ聊天系统03两种通信类.登录以及注册功能完善) TcpSocket类(与服务器进行通信) Server类(服务器类) TcpMessage ...

  5. qq炫舞测试服务器维护,QQ炫舞体验服新界面安装操作方法 体验服开服、删档、维护答疑...

    QQ炫舞新版本体验服发布了,为了保证玩家可以正常更新体验服,本文将带来QQ炫舞体验服新界面安装操作方法,请大家在备份好现网正式服客户端以后,先用这个备份好的客户端登陆正式服的大区,可以正常上去以后,在 ...

  6. java 仿qq空间_仿QQ空间和微信朋友圈,高解耦高复用高灵活

    先看看效果: 用极少的代码实现了 动态详情 及 二级评论 的 数据获取与处理 和 UI显示与交互,并且高解耦.高复用.高灵活. 动态列表界面MomentListFragment支持 下拉刷新与上拉加载 ...

  7. 大多数人没听过的FreeEIM飞鸽传书,超炫酷的仿QQ,九零后都爱玩

    FreeEIM 仿QQ功能的企业即时通讯软件VC++的源代码,最近又更新了一次,完成数据库更改的任务.将聊天记录改用数据库形式,暂且使用Access. 本软件的窗口和功能都与QQ有点相似,可发送文件. ...

  8. java怎么实现发布说说_仿QQ发表说说

    [实例简介]android 仿QQ空间发表说说和选择图片功能 [实例截图] [核心代码] pop = new PopupWindow(MainActivity.this); View view = g ...

  9. java仿qq登录 界面设计,Java Swing仿QQ登录界面效果

    本文实例为大家分享了Java Swing仿QQ登录界面展示的具体代码,供大家参考,具体内容如下 闲来无事将早些时候已实现的QQ登录界面再实现了一遍,纯手工打造(意思是没有用NetBeans.MyEcl ...

最新文章

  1. localStorage
  2. 使用管道符在PowerShell中进行各种数据操作
  3. OpenGL之正背面剔除、深度测试与多边形偏移
  4. hdu 3501 欧拉函数
  5. Kotlin与Java之争
  6. html js停止计时,用 js 写的计时器,暂停计时无法生效
  7. 1.初学MVC3学习笔记1
  8. DM***+OSPF测试
  9. 海康威视面试-java应用开发
  10. 机器学习基础(十一)—— Logistic Regression 梯度更新公式的推导
  11. mysql实现不重复插入数据
  12. 关于MPMoviePlayerController类播放视频时,外放没有声音的问题(ios)
  13. Java面经总结(1)
  14. 【手游逆向】初探Unity3d+il2cpp.so网游修改新手教程篇[内附所有相关工具下载地址和说明介绍】
  15. 湖南省工信厅党组书记、厅长雷绍业一行莅临麒麟信安调研
  16. 用python实现csdn博主全部博文下载,html转pdf,有了学习的电子书了。。。(附源码)
  17. AI围棋学习之路一----棋盘和落子的类构建
  18. IE出现“XMLHttpRequest: 网络错误 0x80070005, 拒绝访问”的解决方案
  19. 云私钥MCK,云平台、公有云、服务器数据安全
  20. [USACO 07NOV]防晒霜Sunscreen {贪心}

热门文章

  1. linux下 lcd显示程序,linux中在应用层lcd显示的操作
  2. 刀片计算机学习资料第273篇:ORI-606 CPCI刀片计算机
  3. 饥饿的小易(枚举+广度优先遍历(BFS))
  4. 认证+1!腾讯云对象存储COS、存储一体机TStor首批通过信通院云原生存储能力评估
  5. 解密百度大数据:百度是如何使用hadoop的,并且做了哪些改进?
  6. 2021年电工(高级)复审考试及电工(高级)模拟考试
  7. jquery几种书写格式
  8. 厦门理工学院OJ 1187.骑士精神 (dfs+剪枝)
  9. BZOJ 2242([SDOI2011]计算器-Baby Step Giant Step第1题)
  10. HTML网页设计:九、网页的简单布局