JAVA实现雪花飘落

目录

一、效果

二、教程

三、代码


一、效果

首先我们先看效果,雪花是流动的,从上往下,依次变大,十分浪漫!(效果是动态的)

二、教程

1、使用IDEA搭建一个项目,项目名称:MyStar(可根据自己的喜好)

具体搭建过程可看博文用IDEA构建一个简单的Java程序范例,这里就不详细说了。

2、MyStar.class

(1)导入包

import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;

(2)主函数

在这里我的panel大小设置的是800*600,大家可以根据自己的喜好设置的更大一些。

public static void main(String[] args) {
        JFrame frame = new JFrame("满天星");
        MyStarPanel panel = new MyStarPanel();
        frame.add(panel);
        Thread t = new Thread(panel);
        t.start();
        frame.setSize(800, 600);
        frame.setVisible(true);
        frame.setLocationRelativeTo((Component)null);
        frame.setDefaultCloseOperation(3);
        frame.setBackground(Color.BLACK);
    }

3、 MyStarPanel.class

(1)导入包

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

(2)类的继承,接口的实现

  • JPanel类:面板组件,非顶层容器
public class MyStarPanel extends JPanel implements Runnable {}

(3)数据类型的定义

  • xx,yy:int,为雪花出现的坐标
  • image:BufferedImage,为图片类型
  • fonts:int,为雪花字体的大小
int[] xx = new int[100];
int[] yy = new int[100];
BufferedImage image;
int[] fonts = new int[100];

(4)画布函数MyStarPanel()

  • for循环:雪花出现的位置随机,一次出现100个

MyStarPanel.class.getResource("shu3.jpg"):获取图片的路径。

用法:类名.class.getResource("")

public MyStarPanel() {
        for(int i = 0; i < 100; ++i) {
            this.xx[i] = (int)(Math.random() * 800);
            this.yy[i] = (int)(Math.random() * 600);
        }

        try {
            this.image = ImageIO.read(MyStarPanel.class.getResource("shu3.jpg"));
        } catch (IOException var2) {
            var2.printStackTrace();
        }

    }

注:图片是我自己提前下载好的,并且放在 项目 -->  target --> classes --> MyStar

(5)画笔函数paint()

  • 画笔名称g
  • 雪花的颜色设置为白色
  • g.setColor(Color.WHITE);
  • for循环:设置雪花“*”的大小,字体。在这里,我们使雪花从上到下依次增大,使其更真实。 
public void paint(Graphics g) {
        g.drawImage(this.image, 0, 0, 800, 600, (ImageObserver)null);
        g.setColor(Color.WHITE);

        for(int i = 0; i < 100; ++i) {
            Font ft = new Font("微软雅黑", 1, this.fonts[i]);
            g.setFont(ft);
            g.drawString("*", this.xx[i], this.yy[i]);
        }
    }

(6)线程函数run()

  • for循环:循环100次
  • 每次循环,yy[i] +1

1、判断边界:我们的画布大小为:800*600,超过100,令yy[i]=0

2、设定不同部分的雪花的大小。

在这里,我设置了三部分:

  • 0 - 150:font[i] = 18
  • 150 - 500:font[i] = 22
  • 500 - 600:font[i] = 32

这里大家可以根据自己的喜欢更改

public void run() {
        while(true) {
            for(int i = 0; i < 100; ++i) {
                int var1 = this.yy[i]++;
                if (this.yy[i] > 600) {
                    this.yy[i] = 0;
                }

                if (this.yy[i] > 0 && this.yy[i] < 150) {
                    this.fonts[i] = 18;
                } else if (this.yy[i] > 150 && this.yy[i] < 500) {
                    this.fonts[i] = 22;
                } else {
                    this.fonts[i] = 32;
                }
            }

            try {
                Thread.sleep(100);
            } catch (InterruptedException var2) {
                var2.printStackTrace();
            }
            this.repaint();
        }
    }
}

三、代码

1、MyStar.class

package MyStar;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JFrame;

public class MyStar {

    public static void main(String[] args) {
        JFrame frame = new JFrame("满天星");
        MyStarPanel panel = new MyStarPanel();
        frame.add(panel);
        Thread t = new Thread(panel);
        t.start();
        frame.setSize(800, 600);
        frame.setVisible(true);
        frame.setLocationRelativeTo((Component)null);
        frame.setDefaultCloseOperation(3);
        frame.setBackground(Color.BLACK);
    }
}

2、MyStarPanel.class

package MyStar;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;

public class MyStarPanel extends JPanel implements Runnable {
    int[] xx = new int[100];
    int[] yy = new int[100];
    BufferedImage image;
    int[] fonts = new int[100];

    public MyStarPanel() {
        for(int i = 0; i < 100; ++i) {
            this.xx[i] = (int)(Math.random() * 800);
            this.yy[i] = (int)(Math.random() * 600);
        }

        try {
            this.image = ImageIO.read(MyStarPanel.class.getResource("shu3.jpg"));
        } catch (IOException var2) {
            var2.printStackTrace();
        }

    }

    public void paint(Graphics g) {
        g.drawImage(this.image, 0, 0, 800, 600, (ImageObserver)null);
        g.setColor(Color.WHITE);

        for(int i = 0; i < 100; ++i) {
            Font ft = new Font("微软雅黑", 1, this.fonts[i]);
            g.setFont(ft);
            g.drawString("*", this.xx[i], this.yy[i]);
        }

    }

    public void run() {
        while(true) {
            for(int i = 0; i < 100; ++i) {
                this.yy[i]++;
                if (this.yy[i] > 600) {
                    this.yy[i] = 0;
                }

                if (this.yy[i] > 0 && this.yy[i] < 150) {
                    this.fonts[i] = 18;
                } else if (this.yy[i] > 150 && this.yy[i] < 500) {
                    this.fonts[i] = 22;
                } else {
                    this.fonts[i] = 32;
                }
            }

            try {
                Thread.sleep(100);
            } catch (InterruptedException var2) {
                var2.printStackTrace();
            }

            this.repaint();
        }
    }
}

 

  • 20
    点赞
  • 124
    收藏
    觉得还不错? 一键收藏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值