Java GUI small case exercise (screen saver ball movement effect)

Show results:

Due to gif compression and scaling to meet the size below 5M, the effect is a bit distorted

Code:

Project structure:

 

 

Ball class:

package com.GUI.Ball;

import java.awt.*;
import java.util.Random;

public class Ball {
    int x;//球在JPanel中的x位置
    int y;//球在JPanel中的y位置
    int d;//球的大小--直径
    //颜色的rgb和透明度a
    int r;
    int g;
    int b;
    int a;
    Color c;
int dx;//小球x轴的偏移量
int dy;//小球y轴的偏移量
    public Ball() {
        init();
    }

    private void init() {
        randomBall();
    }

    //随机生成球的位置大小颜色
    private void randomBall() {
        Random random = new Random();
        x=random.nextInt(1000);
        y=random.nextInt(700);
        d=random.nextInt(200);
        r=random.nextInt(251);//rgba值范围(0-250)
        g=random.nextInt(251);
        b=random.nextInt(251);
        a=random.nextInt(251);
        c=new Color(r,g,b,a);
        dx=random.nextInt(30)-15;//偏移量(-15,+15)
        dy=random.nextInt(30)-15;
    }
    //根据偏移量来改变x,y
public void ball_move() {
    x+=dx;
    y+=dy;
}

}

GameStart class:

package com.GUI.Ball;

import javax.swing.*;

public class GameStart {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame();
        jFrame.setSize(1000,700);
        jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jFrame.setLocationRelativeTo(null);
        jFrame.setResizable(false);
        jFrame.add(new GamePanel());
        jFrame.setVisible(true);
    }
}

GamePanel class:

package com.GUI.Ball;

import javax.swing.*;
import java.awt.*;

public class GamePanel extends JPanel implements Runnable{
    int length=500;//球的个数
    Ball[] balls=new Ball[length];
    Thread t;
    public GamePanel() {
        //进行500个球的实例创建
        for (int i = 0; i <length ; i++) {
            balls[i]=new Ball();
        }
        //开始线程
        t=new Thread(this);
        t.start();
    }

    //绘图
    @Override
    public void paint(Graphics g) {
        super.paint(g);
        //开始画球,主要用g.fillOval
        for (int i = 0; i <length ; i++) {
            int x=balls[i].x;
            int y=balls[i].y;
            int d=balls[i].d;
            g.setColor(balls[i].c);
            g.fillOval(x,y,d,d);//实心球
            balls[i].ball_move();
        }
    }

    @Override
    public void run() {
        while (true) {
            try {
                //进行重绘
                repaint();
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

Guess you like

Origin blog.csdn.net/qq_52135683/article/details/126687516