java 代码实现《黑客帝国》酷炫数字雨效果

本贴最后更新于 3177 天前,其中的信息可能已经事过境迁

直接上效果图:

1472700330637

目前的样子还可以美化,期待其他童鞋效果图 0.0
下边是代码

package cn.com.entity; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Cursor; import java.awt.Dimension; import java.awt.Font; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Point; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.image.MemoryImageSource; import java.util.Random; import javax.swing.JDialog; import javax.swing.JPanel; import javax.swing.Timer; public class Rain extends JDialog implements ActionListener { private static final long serialVersionUID = 1549334578038217282L; private Random random = new Random(); private Dimension screenSize; private JPanel graphicsPanel; // 行高,列宽 private final static int gap = 20; // 存放雨点顶部的位置信息(marginTop) private int[] posArr; // 行数 private int lines; // 列数 private int columns; public Rain() { initComponents(); } private void initComponents() { setLayout(new BorderLayout()); graphicsPanel = new GraphicsPanel(); add(graphicsPanel, BorderLayout.CENTER); // 设置光标不可见 Toolkit defaultToolkit = Toolkit.getDefaultToolkit(); Image image = defaultToolkit.createImage(new MemoryImageSource(0, 0, null, 0, 0)); Cursor invisibleCursor = defaultToolkit.createCustomCursor(image, new Point(0, 0), "cursor"); setCursor(invisibleCursor); // ESC键退出 KeyPressListener keyPressListener = new KeyPressListener(); this.addKeyListener(keyPressListener); // this.setAlwaysOnTop(true); // 去标题栏 this.setUndecorated(true); // 全屏 this.getGraphicsConfiguration().getDevice().setFullScreenWindow(this); this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); setVisible(true); screenSize = Toolkit.getDefaultToolkit().getScreenSize(); lines = screenSize.height / gap; columns = screenSize.width / gap; posArr = new int[columns + 1]; random = new Random(); for (int i = 0; i < posArr.length; i++) { posArr[i] = random.nextInt(lines); } // 每秒10帧 new Timer(100, this).start(); } /** * @return 随机字符 */ private char getChr() { return (char) (random.nextInt(94) + 33); } @Override public void actionPerformed(ActionEvent e) { graphicsPanel.repaint(); } private class GraphicsPanel extends JPanel { private static final long serialVersionUID = 3043939524168375053L; @Override public void paint(Graphics g) { Graphics2D g2d = (Graphics2D) g; g2d.setFont(getFont().deriveFont(Font.BOLD)); g2d.setColor(Color.BLACK); g2d.fillRect(0, 0, screenSize.width, screenSize.height); // 当前列 int currentColumn = 0; for (int x = 0; x < screenSize.width; x += gap) { int endPos = posArr[currentColumn]; g2d.setColor(Color.CYAN); g2d.drawString(String.valueOf(getChr()), x, endPos * gap); int cg = 0; for (int j = endPos - 15; j < endPos; j++) { // 颜色渐变 cg += 20; if (cg > 255) { cg = 255; } g2d.setColor(new Color(0, cg, 0)); g2d.drawString(String.valueOf(getChr()), x, j * gap); } // 每放完一帧,当前列上雨点的位置随机下移1~5行 posArr[currentColumn] += random.nextInt(5); // 当雨点位置超过屏幕高度时,重新产生一个随机位置 if (posArr[currentColumn] * gap > getHeight()) { posArr[currentColumn] = random.nextInt(lines); } currentColumn++; } } } private class KeyPressListener extends KeyAdapter { @Override public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ESCAPE) { System.exit(0); } } } public static void main(String[] args) { new Rain(); } }

这是 html 版的

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style type="text/css"> canvas { display: block; } </style> </head> <body> <canvas id="canvas"></canvas> <script> function $(id) { return document.getElementById(id); } //画布 的大小设置 var mywindow = window.screen; var canvas = $("canvas"); canvas.width = mywindow.width; canvas.height = mywindow.height; //要输出的信息 var str = "0123456789"; str = str.split(""); var fontSize = 16;//输出字体的大小 //每列显示多少个信息 var cols = canvas.width / fontSize; //数组,统计下落的位置 var drops = []; for (var i = 0; i < cols; i++) { drops[i] = 1; } var ctx = canvas.getContext("2d"); function draw() { /** *这的黑客帝国: * 获取页面的 大小 包括宽度和高度 * 用cols获取能够宽度加载列数 * drops加载每一列的位置 * drops[2]=10 2为第二排的 top为10 */ ctx.fillStyle = "rgba(0,0,0,0.05)"; ctx.fillRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = "green"; ctx.font = fontSize + "px arial"; for (var i = 0; i < cols; i++) { var text = str[Math.floor(Math.random() * (str.length))]; // console.info("x-"+i*fontSize); // console.info("y-"+drops[i]*fontSize); ctx.fillText(text, i * fontSize, drops[i] * fontSize); if (drops[i] * fontSize > canvas.height || Math.random() > 0.95) drops[i] = 0;//把位置恢复到最上面 //控制下落的位置 drops[i]++; } } setInterval(draw, 33); </script> </body> </html>
  • 分享

    有什么新发现就分享给大家吧!

    248 引用 • 1794 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8216 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • relyn

    改成 JS 版吧,哈哈

  • 88250

    这个是屏保版 [1471919913151]

  • Stone
    作者

    @88250 我看过这个,因为不是全屏的不是全屏的

  • 88250

    贴代码的时候用 Markdown GFM 语法吧

  • Stone
    作者

    @88250 不知道怎么搞,刚才发 html 竟然没出来

    1 回复
  • 88250

    用 ``` 把代码块包起来就行

  • ZephyrJung 1 2 赞同

    酷,最喜欢这种代码可直接运行的东西 👍

  • Stone
    作者

    以前从来没写过博客,格式的东西一窍不通,刚才看了一下你说的 Markdown GFM 语法 需要加一些标签才能实现 0.0

    1 回复
  • 88250

    我帮你更新了一下,你点编辑看下内容就知道怎么高亮代码了,注意 ``` 。

  • Stone
    作者

    @88250 感谢 D 大 嘿嘿

    1 回复
  • 88250 1

    请点感谢,哈哈

  • Stone
    作者

    @88250 卧槽(二声:表示疑问)还有这功能!!

    1 回复
  • 88250

    有很多功能的啦,慢慢探索一下 😍

  • junze

    用 jS 就 OK

  • wstv 1

    很强势的代码

  • newsky001 1

    这个试了一下,很强势

  • ZephyrJung 1 赞同

    楼主你好,我将这段代码放到了 github 上,请知悉 🙏
    如觉不妥,我将立刻删除
    https://github.com/ZephyrJung/html5

请输入回帖内容 ...

推荐标签 标签

  • 自由行
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • Office

    Office 现已更名为 Microsoft 365. Microsoft 365 将高级 Office 应用(如 Word、Excel 和 PowerPoint)与 1 TB 的 OneDrive 云存储空间、高级安全性等结合在一起,可帮助你在任何设备上完成操作。

    5 引用 • 34 回帖
  • JavaScript

    JavaScript 一种动态类型、弱类型、基于原型的直译式脚本语言,内置支持类型。它的解释器被称为 JavaScript 引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML 网页上使用,用来给 HTML 网页增加动态功能。

    733 引用 • 1280 回帖
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 392 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 13 关注
  • Bug

    Bug 本意是指臭虫、缺陷、损坏、犯贫、窃听器、小虫等。现在人们把在程序中一些缺陷或问题统称为 bug(漏洞)。

    76 引用 • 1742 回帖 • 7 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 649 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 373 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 530 关注
  • 996
    13 引用 • 200 回帖 • 8 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    290 引用 • 4494 回帖 • 653 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 77 回帖
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    227 引用 • 476 回帖
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    86 引用 • 165 回帖 • 4 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    107 引用 • 153 回帖
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 175 关注
  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 30 关注
  • NetBeans

    NetBeans 是一个始于 1997 年的 Xelfi 计划,本身是捷克布拉格查理大学的数学及物理学院的学生计划。此计划延伸而成立了一家公司进而发展这个商用版本的 NetBeans IDE,直到 1999 年 Sun 买下此公司。Sun 于次年(2000 年)六月将 NetBeans IDE 开源,直到现在 NetBeans 的社群依然持续增长。

    78 引用 • 102 回帖 • 701 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 344 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    21 引用 • 245 回帖 • 228 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 3 关注
  • CAP

    CAP 指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可兼得。

    12 引用 • 5 回帖 • 630 关注
  • CongSec

    本标签主要用于分享网络空间安全专业的学习笔记

    1 引用 • 1 回帖 • 31 关注
  • 智能合约

    智能合约(Smart contract)是一种旨在以信息化方式传播、验证或执行合同的计算机协议。智能合约允许在没有第三方的情况下进行可信交易,这些交易可追踪且不可逆转。智能合约概念于 1994 年由 Nick Szabo 首次提出。

    1 引用 • 11 回帖 • 2 关注
  • CodeMirror
    2 引用 • 17 回帖 • 162 关注