一. 小游戏
小游戏实现需要涉及知识点
- java实现一个窗体 – 固定调用
- 相关类: java.Swing窗体设计
- 窗体 JFrame
- 内容面板 JPanel
- 画笔工具(Graphics), 图形, 文字, 图片
- 变量 数据类型 if分支 循环语句 多线程 图片 IO流
雪花飘落
分析项目中有哪些内容
有窗体, 有画布, 有雪花, 有标题
- 创建一个窗体类SnowJFrame,继承JFrame类
//1.JFDemo找一个父亲 JFrame 提供窗体对象的创建,大小的设置,别的一些属性
public class SnowJFrame extends JFrame{
public SnowJFrame() {
//设置窗体的大小
this.setSize(600, 500);
//设置窗体位置居中
this.setLocationRelativeTo(null);
//设置关联关闭按钮
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体的名称
this.setTitle("雪花飘落");
//使窗体可视化
this.setVisible(true);//调用的是父类JFrame里的方法setVisible(true)
}
}
public static void main(String[] args) {
//对象创建 类名 对象名 =new 类名称();
SnowJFrame jf=new SnowJFrame();
}
- 以上代码完成窗体的设置
- 创建SnowJPanel内容类, 添加到窗口类中
//1.JFDemo找一个父亲 JFrame 提供窗体对象的创建,大小的设置,别的一些属性
public class SnowJFrame extends JFrame{
//构造方法1.用于创建对象2.用于初始化对象
public JFDemo() {
//创建画布类对象jp
SnowJPanel jp = new SnowJPanel();
//将画布类对象jp放到窗体类对象jf上
this.add(jp);
//使窗体可视化
this.setVisible(true);//调用的是父类JFrame里的方法setVisible(true)
}
public static void main(String[] args) {
//对象创建 类名 对象名 =new 类名称();
JFDemo jf=new JFDemo();
}
}
- 给内容类SnowJPanel添加内容
- 添加黑色背景(画一个黑色背景) 或者 画一张背景图片–使用 画笔 快捷键 paint+回车
- 画 * – 循环 ;
public class SnowJPanel extends JPanel {
@Override
public void paint(Graphics g) {
super.paint(g);
//g.drawImage(图片位置,x轴 ,y轴 ,null )
//this.setBackground(Color.BLACK);//设置幕布背景色
try {
BufferedImage image = ImageIO.read(new File("img\\2.jpg"));
System.out.println(image);
g.drawImage(image, 0, 0, null);
g.setColor(Color.WHITE);//设置画笔颜色
//画一个雪花
//g.drawString("*", 10, 10);
//设置字体的大小
g.setFont(new Font("", 1, 25));
Random rand = new Random();
for (int i = 0; i <50 ; i++) {
g.drawString("*",rand.nextInt(800) , rand.nextInt(520));
}
} catch (IOException e) {
e.printStackTrace();
}
}
- 设置雪花的降落
// 设置雪花降落 – 多线程
// 先实现 implements Runnable, 直接重写run方法
// 线程需要启动-start
// 什么时候启动 ? 程序一启动,雪花就开始落了 – 构造方法
解决:将数组定义在外部
// 多线程:
@Override
//实现Runnable接口自动重写run方法
public void run() { // 线程需要启动 start,才会执行
//控制每一个雪花的Y轴坐标 -- 延迟
// 循环往下落 -- 死循环
while(true) {
// 雪花的对象 -- 在画笔方法里
// 需要记录每次雪花 y 的位置 -- 数组
//arrY数组中的每一个值都要动
for (int i = 0; i < arrY.length; i++) {
arrY[i]++; //雪花的Y坐标++
if(arrY[i]==520){
arrY[i]=0;
}
// 刷新界面
repaint();
try {
Thread.sleep(10); // 0.01s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- 问题
每隔0.01s就会生成50个雪花
解决: 生成50个雪花只执行一次- 程序一开始运行的时候执行一次-- 构造方法中
public class SnowJPanel extends JPanel implements Runnable {
// 创建整数的数组,保存50个雪花的坐标
int[] arrY = new int[50];
int[] arrX = new int[50];
Random rand = new Random();
//绘一张图片 ,使用 画笔 快捷键 paint+回车
public SnowJPanel() {
//启动线程
new Thread(this).start();
//产生50个雪花 , 保存雪花的初始位置
for (int i = 0; i <50 ; i++) {//记录每个雪花的位置, 数组
int x = rand.nextInt(800);
int y = rand.nextInt(520);
// 将 y 的值 保存到数组中
arrY[i] = y;
// 将 x 的值 保存到数组中
arrX[i] = x;
}
}
7. 内容部分代码全部
package cn.tedu.mysnow;
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Random;
//内容面板
public class SnowJPanel extends JPanel implements Runnable {
// 创建整数的数组,保存50个雪花的坐标
int[] arrY = new int[50];
int[] arrX = new int[50];
Random rand = new Random();
//绘一张图片 ,使用 画笔 快捷键 paint+回车
public SnowJPanel() {
//启动线程
new Thread(this).start();
//产生50个雪花 , 保存雪花的初始位置
for (int i = 0; i <50 ; i++) {//记录每个雪花的位置, 数组
int x = rand.nextInt(800);
int y = rand.nextInt(520);
// 将 y 的值 保存到数组中
arrY[i] = y;
// 将 x 的值 保存到数组中
arrX[i] = x;
}
}
@Override
public void paint(Graphics g) {
super.paint(g);
//g.drawImage(图片位置,x轴 ,y轴 ,null )
//this.setBackground(Color.BLACK);//设置幕布背景色
try {
BufferedImage image = ImageIO.read(new File("img\\2.jpg"));
//System.out.println(image);
g.drawImage(image, 0, 0, null);
g.setColor(Color.WHITE);//设置画笔颜色
//画一个雪花
//g.drawString("*", 10, 10);
//设置字体的大小
g.setFont(new Font("", 1, 25));
for (int i = 0; i <50 ; i++) {//记录每个雪花的位置, 数组
g.drawString("*",arrX[i] , arrY[i]);
}
} catch (IOException e) {
e.printStackTrace();
}
}
// 设置雪花降落 -- 多线程
// 先实现 implements Runnable, 直接重写run方法
// 线程需要启动-start
// 什么时候启动 ? 程序一启动,雪花就开始落了 -- 构造方法
@Override
public void run() { // 线程需要启动 start,才会执行
//控制每一个雪花的Y轴坐标 -- 延迟
// 循环往下落 -- 死循环
while(true) {
// 雪花的对象 -- 在画笔方法里
// 需要记录每次雪花 y 的位置 -- 数组
//arrY数组中的每一个值都要动
for (int i = 0; i < arrY.length; i++) {
arrY[i]+=3; //雪花的Y坐标++
if(arrY[i]==520){
arrY[i]=0;
}
// 刷新界面
repaint();
try {
Thread.sleep(1); // 0.001s
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
- 窗体部分代码全部
package cn.tedu.mysnow;
import javax.swing.*;
public class SnowJFrame extends JFrame {
public SnowJFrame() {
//设置窗体的大小
this.setSize(680, 520);
//设置窗体位置居中
this.setLocationRelativeTo(null);
//设置关联关闭按钮
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗体的名称
this.setTitle("雪花飘落");
this.add(new SnowJPanel());
//使窗体可视化
this.setVisible(true);//调用的是父类JFrame里的方法setVisible(true)
}
public static void main(String[] args) {
SnowJFrame jf = new SnowJFrame();
}
}
弹弹球
- 创建画布类TanQiuJPanel,继承JPanel类
- 重写Paint方法,在paint方法里设置画布的背景色
- 创建move方法,用于编写小球的移动
- 实现MouseMotionListener接口,重写mouseMoved方法
- 创建TanQiuJPanel无参构造方法,添加一个鼠标监听实践