JAVA面向对象小游戏

一. 小游戏

小游戏实现需要涉及知识点

  1. java实现一个窗体 – 固定调用
  2. 相关类: java.Swing窗体设计
    • 窗体 JFrame
    • 内容面板 JPanel
    • 画笔工具(Graphics), 图形, 文字, 图片
  3. 变量 数据类型 if分支 循环语句 多线程 图片 IO流

雪花飘落

分析项目中有哪些内容
有窗体, 有画布, 有雪花, 有标题

  1. 创建一个窗体类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();
}
  1. 以上代码完成窗体的设置
  2. 创建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();

	}
}

  1. 给内容类SnowJPanel添加内容
  1. 添加黑色背景(画一个黑色背景) 或者 画一张背景图片–使用 画笔 快捷键 paint+回车
  2. 画 * – 循环 ;
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();
        }
}
  1. 设置雪花的降落

// 设置雪花降落 – 多线程
// 先实现 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();
                }
            }
        }
  1. 问题

每隔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();
                }
            }
        }
    }
}

  1. 窗体部分代码全部
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();
    }
}


弹弹球

  1. 创建画布类TanQiuJPanel,继承JPanel类
  2. 重写Paint方法,在paint方法里设置画布的背景色
  3. 创建move方法,用于编写小球的移动
  4. 实现MouseMotionListener接口,重写mouseMoved方法
  5. 创建TanQiuJPanel无参构造方法,添加一个鼠标监听实践
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值