当前位置:

首页 > 编程开发 > 如何用Java实现一场浪漫的流星表白?

如何用Java实现一场浪漫的流星表白?

介绍本文实现的功能有:1、播放音乐2、自定义流星数量、飞行速度、光晕大小、流星大小3、自定义表白话语运用到的知识点有:GUI:java实现窗体、Swing。其实JAVASwing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏、小项目,练练手的。多线程:让cpu同一时间处理多个任务(本文中涉及到音乐、文字缓慢出现、流星线条移动)效果图:音乐类(其实也可以不用音乐,有些人并不喜欢):核心代码importjavazoom.jl.decoder.JavaLayerException;

本文目录

    介绍

    本文实现的功能有:

    1、播放音乐

    2、自定义流星数量、飞行速度、光晕大小、流星大小

    3、自定义表白话语 

    运用到的知识点有:

    GUI:java实现窗体、Swing。其实JAVA Swing的GUI目前企业中已经不用了,主要是一些学校和培训机构用来教导学生写一些游戏、小项目,练练手的。 

    多线程:让cpu同一时间处理多个任务(本文中涉及到音乐、文字缓慢出现、流星线条移动)

    效果图:

    如何用Java实现一场浪漫的流星表白?

    音乐类(其实也可以不用音乐,有些人并不喜欢): 

    核心代码

    import javazoom.jl.decoder.JavaLayerException;
    import javazoom.jl.player.Player;
     
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
     
    public class MusicThread extends Thread{
        @Override
        public void run() {
            //播放音乐
            System.out.println("开始播放");
            //表示音乐文件
            File f = new File("nv.mp3");
            //第三方jar包  Player类
     
            try {
                Player p = new Player(new FileInputStream(f));//参数:文件输入流对象
                // p.play();
            } catch (FileNotFoundException | JavaLayerException e) {
                e.printStackTrace();
            }
     
        }
    }

    实现类: 

    import javazoom.jl.decoder.JavaLayerException;
    import javazoom.jl.player.Player;
     
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.Random;
    import javax.swing.*;
     
    public class MeteorFly extends JFrame {
        int AppletWidth, AppletHeight;
        final int MAX = 6; // (~)流星的个数
        final int SLEEP = 2; // 流星飞行的速度(数值越大,速度越慢)
        final int COLORLV = 1; // (~)色阶(可改变光晕大小)
        final int SIZE = 3 ; // (~)流星大小
        private MyPanel panel;
        public MeteorFly() {
            panel = new MyPanel();
            this.setTitle("LOVE");
            this.getContentPane().add(panel);
            this.setSize(AppletWidth, AppletHeight); // 创建窗体
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setVisible(true);
        }
        public static void main(String[] args) {
            new Thread(){
                @Override
                public void run() {
                    //声明一个File对象
                    File mp3 = new File("nv.mp3");
                    //创建一个输入流
                    FileInputStream fileInputStream = null;
     
                    try {
                        fileInputStream = new FileInputStream(mp3);
                        //创建一个缓冲流
                        BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
                        //创建播放器对象,把文件的缓冲流传入进去
                        Player player = new Player(fileInputStream);
                        //调用播放方法进行播放
                        player.play();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    } catch (JavaLayerException e) {
                        e.printStackTrace();
                    }
                }
            }.start();
            new MeteorFly();
        }
     
        class MyPanel extends JPanel implements Runnable {
            Meteor p[];
            BufferedImage OffScreen;
            Graphics drawOffScreen;
            Thread pThread;
            Font drawFont = new Font("Arial",0,28);
            public MyPanel() {
                //setBackground(Color.black); //窗体初始化
                AppletWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
                AppletHeight = Toolkit.getDefaultToolkit().getScreenSize().height-200;
                p = new Meteor[MAX];
                for (int i = 0; i < MAX; i++) {
                    p[i] = new Meteor();
                }
                OffScreen = new BufferedImage(AppletWidth, AppletHeight,
                        BufferedImage.TYPE_INT_BGR);
                drawOffScreen = OffScreen.getGraphics();
                pThread = new Thread(this);
                pThread.start();
     
                new Thread(){
                    @Override
                    public void run() {
                        try {
                            sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        str1 = "流星雨是世间宝藏,而你是我的人间理想";
                        while(true){
                                try {
                                    sleep(150);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                pos++;
                                if (pos > str1.length() - 1) {
                                    pos = str1.length() - 1;
                                    break;
                                }
                        }
                    }
                }.start();
     
            }
            int pos = 0;
            String str1 = "                                                                   ";
            @Override
            public void paintComponent(Graphics g) {
                super.paintComponents(g);
                g.drawImage(OffScreen, 0, 0, this);
                g.setColor(Color.pink);
                g.setFont(new Font("宋体", Font.BOLD, 50));
                g.drawString(str1.substring(0,pos+1),260,700);
            }
            @Override
             public void run() {
                while (true) {
                    for (int i = 0; i < MAX; i++) {
                        drawOffScreen.setColor(p[i].color); // RGB颜色
                        drawOffScreen.fillOval(p[i].x, p[i].y, SIZE, SIZE);
                        p[i].x += p[i].mx;
                        p[i].y += p[i].my;
                        int x = p[i].x;
                        int y = p[i].y;
                        int R = p[i].color.getRed(); // 提取颜色
                        int G = p[i].color.getGreen();
                        int B = p[i].color.getBlue();
                        while (true) {
                            if (R ==0 && G ==0 && B ==0 ) {
                                break;
                            }
                            R -= COLORLV; // 尾部颜色淡化
                            if (R <0 ) {
                                R =0 ;
                            }
                            G -= COLORLV;
                            if (G <0 ) {
                                G =0 ;
                            }
                            B -= COLORLV;
                            if (B < 0) {
                                B =0 ;
                            }
                            Color color = new Color(R, G, B);
                            x -= p[i].mx; // 覆盖尾部
                            y -= p[i].my;
                            drawOffScreen.setColor(color);
                            drawOffScreen.fillOval(x, y, SIZE, SIZE);
                        }
                        if (x > AppletWidth || y > AppletHeight) { // 流星飞出窗口,重置流星
                            p[i].reset();
                        }
                    }
                    repaint();
                    try {
                        Thread.sleep(SLEEP);
                    } catch (InterruptedException e) {
                    }
                }
            }
        }
        class Meteor { // 流星类
            int x, y; // 流星的位置
            int mx, my; // 下落速度
            Color color; // 流星颜色
            Random r = new Random();
            public Meteor() {
                reset();
            }
            public void reset() {
                int rand = (int) (Math.random() *100 ); //随机生成流星出现位置
                if (rand >35 ) {
                    x = (int) (Math.random() *600 );
                    y = 0;
                } else {
                    y = (int) (Math.random() * 150);
                    x =0 ;
                }
                mx = r.nextInt(2)+2; //随机生成下落速度和角度
                my = 1;
                color = new Color(
                            // 随机颜色
                        (new Double(Math.random() *128 )).intValue() +128 ,
                            (new Double(Math.random() *128 )).intValue() +128 ,
                            (new Double(Math.random() * 128)).intValue() + 128);
            }
        }
    }

    这里的Player类需要自己导包,包我放在这个链接里了:

    链接  提取码: v22q

    注意事项

    导包过程中可能有些人会出现这种问题:

    如何用Java实现一场浪漫的流星表白?

    实际应该是可以打开的: 

    如何用Java实现一场浪漫的流星表白?

    如何导包:

    先要将包复制粘贴到项目包下

    然后进入:File –> Project Structure

    如何用Java实现一场浪漫的流星表白?

    然后依次点击Libraries、+号、Java

    如何用Java实现一场浪漫的流星表白?

    找到你要导的文件的位置,然后一直点OK就行了。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 Java
    相关文章 更多
    Yandex官网入口及网页搜索使用方法
    Yandex官网入口及网页搜索使用方法

    Yandex官网入口是https://www.yondex.net/,该平台支持多语言切换、智能搜索匹配、虚拟键盘变更及实时翻译,提供地图、图片、新闻、购物等垂直服务,并具备账户同步、隐私管理、个性化首页和云存储等功能。

    Java单元测试入门:使用JUnit 5编写第一个测试用例
    Java单元测试入门:使用JUnit 5编写第一个测试用例

    面向初学者的JUnit 5实用入门指南。从测试概念、Maven依赖配置,到手把手编写首个单元测试用例及断言验证,助你掌握Java单元测试的核心流程。

    Java变量未初始化报错解析:局部变量与成员变量默认值差异
    Java变量未初始化报错解析:局部变量与成员变量默认值差异

    深入解析Java中局部变量未初始化编译报错与成员变量自动赋予默认值的机制差异,涵盖JVM内存分配、编译期确定性赋值检查与实际排查修复方案。

    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat
    Java获取当前时间并格式化输出:DateTimeFormatter与SimpleDateFormat

    详细讲解在Java中获取当前系统时间并进行格式化输出的两种核心方案:基于Java 8全新日期时间API的DateTimeFormatter与传统遗留的SimpleDateFormat,包含完整代码示例、线程安全机制对比及生产选型建议。

    Java中final与static final常量的定义及初始化规则
    Java中final与static final常量的定义及初始化规则

    深入解析Java中final变量与static final常量的定义、内存语义、初始化时机及合法赋值路径,涵盖编译期常量优化与实战避坑指南。

    Java抽象方法与接口方法的区别及选型建议
    Java抽象方法与接口方法的区别及选型建议

    深入对比Java中抽象类抽象方法与接口方法的语法演进、设计意图及运行期差异,并提供清晰的架构选型决策流程与实战范例。

    Java实现HTTP请求与JSON解析的完整代码示例
    Java实现HTTP请求与JSON解析的完整代码示例

    本文提供Java标准库HttpClient发起HTTP GET/POST请求并结合Jackson进行JSON数据反序列化与序列化的完整代码示例与工程实践指南。

    Java递归出现StackOverflowError的原因分析及栈空间优化方案
    Java递归出现StackOverflowError的原因分析及栈空间优化方案

    详细分析Java递归调用出现StackOverflowError的原因,结合代码说明线程栈、栈帧和递归深度之间的关系,并介绍终止条件排查、迭代改写、减少栈帧开销以及通过-Xss调整JVM栈空间的方法。

    Java空指针异常(NPE)的代码排查与修复实例
    Java空指针异常(NPE)的代码排查与修复实例

    针对Java中常见的NullPointerException(NPE),本文从堆栈日志定位、典型代码触发场景、具体修复代码对比到防御体系进行系统讲解,提供实用且易上手的排查与修复方案。

    selenium上传文件教程本地文件路径设置方法
    selenium上传文件教程本地文件路径设置方法

    深入解析Selenium处理文件上传的技术细节,涵盖标准HTML控件的路径直接注入法与非标准控件的系统级模拟方案,提供Windows与Linux环境下的路径设置最佳实践及常见异常排查。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。