桌面小球项目

这篇博客介绍了如何使用Java Swing库创建一个简单的GUI应用程序,展示一个小球在桌面上移动的动画效果。通过继承JFrame类,实现了窗口的加载、图片的加载以及小球的动态绘制。小球的运动通过改变其横纵坐标模拟,并利用数学公式实现碰撞反弹。最后,通过不断重绘窗口以实现动画效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//摘自 尚学堂 百战程序员 Java300集

简化的代码
MyPro01 里 new – Folder – images(与 src 同层)
src – new – class – BallGame

开头导入俩个包

import java.awt.*;						//窗口,按钮、文本框
import javax.swing.*;					//图形可视包,导入这个包后才能进行GUI图形化软件的开发

BallGame 继承 JFrame

①窗口加载

void launchFrame(){
	setSize(856,500);							//窗口尺寸
	setLocation(50,50);							//窗口位置(左上角)
	setVisible(true);								//显示/隐藏GUI组件的。需要显示则使用true,需要隐藏则使用false。
}

在 main 里创建对象

BallGame game = new BallGame();
game.launchFrame();

②图片加载
ball
ball.png
desk
desk.jpg

//ball、desk俩个对象代表两张图片
Image ball = Toolkit.getDefaultToolkit().getImage("image/ball.png");
Image desk = Toolkit.getDeafultToolkit().getImage("images/desk.png");

//画窗口方法
public void paint(Graphics g){
	System.out.println("窗口被画了一次!");
	
	//先画桌面再画小球
	g.drawImage(desk,0,0,null);							//img,x,y,observer
	g.drawImage(ball,100,100,null);

③小球动起来 (关键一步)

//反复画 ball 窗口(在窗口加载项)
while(true){
	repaint();														//调用时,再调用 paint 方法
	try{
		Thread.sleep(40);									//40 ms 一秒画25次窗口
	}catch(Exception e){
		e.printStackTrace();
	}
}

//图片加载
double x = 100;
double y = 100;

//画窗口 x = x + 10;

//判断条件
boolean right = true;

//具体判断条件需要计算
if(right){
	x = x+10;
}else{
	x = x-10;
}
if(x>856){
	right = false;
}
if(x<0){
 	right = true;
 }

BallGame 最终代码

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

public class BallGame extends JFrame {
	
	//图片加载
	Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
	Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.jpg");
	
	double x = 100;				//小球横坐标
	double y = 100;				//小球纵坐标
	boolean right = true;		//方向
	
	//画窗口
	public void paint(Graphics g){
		System.out.println("窗口被画了一次");
		g.drawImage(desk,0,0,null);
		g.drawImage(ball,(int)x,(int)y,null);
		
		if(right) {
			x = x + 10;
		}
		else {
			x = x - 10;
		}
		//改变方向
		if(x>856-40-30) {		//856是窗口宽度,40是桌子边框的宽度,30是小球的直径
			right = false;
		}
		if(x<40)				//40是桌子边框的宽度
		{
			right = true;
		}
		
	}
	
	//窗口加载
	void launchFrame() {
		setSize(856,500);
		setLocation(50,50);
		setVisible(true);
		
		//反复画窗口 一秒25次
		while(true) {
			repaint();
			try {
				Thread.sleep(40);
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BallGame game = new BallGame();
		game.launchFrame();
	}

}

效果图
在这里插入图片描述

BallGame 2 加入弧度机制

double degree = 3.14 / 3;				//弧度
x = x + 10 * Math.cos(degree);
y = y + 10 * Math.sin(degree);

//判断条件
if(y>500-40-30||y<40+40){					//小球不能超出桌面宽度,弹回
	degree = -degree;
}
if(x<40||x>856-40-30){							//小球不能超出桌面长度,弹回
	degree = 3.14 - degree;
}

BallGame2 最终代码

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

public class BallGame2 extends JFrame {
	
	//图片加载
	Image ball = Toolkit.getDefaultToolkit().getImage("images/ball.png");
	Image desk = Toolkit.getDefaultToolkit().getImage("images/desk.jpg");
	
	double x = 100;				//小球横坐标
	double y = 100;				//小球纵坐标
	
	double degree = 3.14/3;		//弧度,此处就是60°
	
	//画窗口
	public void paint(Graphics g){
		System.out.println("窗口被画了一次");
		g.drawImage(desk,0,0,null);
		g.drawImage(ball,(int)x,(int)y,null);
		
		x = x + 10*Math.cos(degree);
		y = y + 10*Math.sin(degree);
		
		//碰到上下边界
		if(y>500-40-30||y<40+40) {		//500是窗口高度,40是桌子边框,30是球直径,还有一个40是标题栏高度
			degree = -degree;
		}
		
		//碰到左右边界
		if(x<40||x>856-40-30) {
			degree = 3.14 - degree;
		}
		
	}
	
	//窗口加载
	void launchFrame() {
		setSize(856,500);
		setLocation(50,50);
		setVisible(true);
		
		//反复画窗口 一秒25次
		while(true) {
			repaint();
			try {
				Thread.sleep(40);
			}catch(Exception e) {
				e.printStackTrace();
			}
		}
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BallGame2 game = new BallGame2();
		game.launchFrame();
	}

}

效果图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值